主题 : socket编程出现recv: Transport endpoint is not connected 错误,急??? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 5164
精华: 0
发帖: 37
金钱: 320 两
威望: 280 点
综合积分: 74 分
注册时间: 2009-04-12
最后登录: 2011-06-07
楼主  发表于: 2009-05-03 10:56

 socket编程出现recv: Transport endpoint is not connected 错误,急???

服务器与客户端已经连通了,并且服务器发的第一条信息Your User ID:客户端已经收到,紧接着应该是服务器端等待客户端发过来的验证信息,可还没等客户端从键盘输入验证信息,服务器端就提示recv: Transport endpoint is not connected 错误,异常退出,而客户端仍处在等待用户键盘输入状态,是什么原因??高手请教,不胜感激!!!
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-05-03 12:01
贴出服务器和客户端程序的源代码
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 5164
精华: 0
发帖: 37
金钱: 320 两
威望: 280 点
综合积分: 74 分
注册时间: 2009-04-12
最后登录: 2011-06-07
2楼  发表于: 2009-05-03 12:05
好的,多谢!

/* server.c */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define PORT 2222
#define LISTEN 10
#define MAX_RECV 20

int main()
{  //定义变量
  struct sockaddr_in server_sock,client_sock;
  int sockfd,client_fd;
  int socklen=sizeof(struct sockaddr_in);
  int iMsg=0;
  extern int errno;
  char buf[MAX_RECV];//接收缓冲区
  char *SERVER_MESSG[]=
  {
   //"Hi,I am Fedora10 host!",
   "Your User ID:",
   "Your Password:",
   "Welcome you,",
   NULL
  };
  char *CLIENT_INFO[]=
  {
   "FriendlyARM",
   "123456"
  };
  //创建socket数据结构
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  {
    perror("socket");
    exit(1);
  }
  printf("socket success!,sockfd=%d\n",sockfd);
  //初始化服务器端socket
  memset(&server_sock,0,socklen);
  server_sock.sin_family=AF_INET;
  server_sock.sin_port=htons(PORT);
  server_sock.sin_addr.s_addr=htonl(INADDR_ANY);
  //绑定端口
  if(bind(sockfd,(struct sockaddr *)&server_sock,socklen)==-1)
  {
    perror("bind");
    exit(1);
  }
  printf("bind success!\n");
  //监听...
  if(listen(sockfd,LISTEN)==-1)
  {
    perror("listen");
    exit(1);
  }
  printf("listening...\n");
  //循环处理
  while(1)
  {  //接受处理
    if((client_fd=accept(sockfd,(struct sockaddr *)&client_sock,&socklen))==-1)
    {
      perror("accept");
      exit(1);
    }
    else printf("accept success!\n");
    //处理过程
    do
    {//向客户机发送信息
     if(send(client_fd,SERVER_MESSG[iMsg],strlen(SERVER_MESSG[iMsg]),0)==-1)
     {
       perror("send");
       printf("errno=%d\n",errno);
       char * mesg = strerror(errno);
       printf("Mesg:%s\n",mesg);
       exit(1);
     }
     printf("Have sent:%s\n",SERVER_MESSG[iMsg]);
     //处理来自客户机的验证信息
     while(iMsg<2)
     {
       bzero(buf,MAX_RECV);
       if(recv(sockfd,buf,MAX_RECV,0)==-1)
       {
         perror("recv");
         printf("errno=%d\n",errno);
         char * mesg = strerror(errno);
         printf("Mesg:%s\n",mesg);
         exit(1);
       }
       if(strcmp(buf,CLIENT_INFO[iMsg])==0)break;
       else
         if(send(sockfd,"WRONG! Try again!",strlen("WRONG!Try again!"),0)==-1);
          {
            perror("send");
            exit(1);
          }  
     }
     //指向下一条消息
     iMsg++;    
    }while(SERVER_MESSG[iMsg]);//一次处理过程结束
    close(client_fd);
  }//等待下一个客户机连接

  close(sockfd);
}


/* client.c */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#define PORT 2222
#define MAX_RECV 20
#define MAX_INFO 15    

int main(int argc,char **argv)
{ //定义变量
  struct sockaddr_in serv_addr;
  int sockfd,n,i=0;
  //char *host_ip;
  char buf[MAX_RECV],user_info[MAX_INFO];
  struct hostent *host;
  int socklen=sizeof(struct sockaddr_in);
  //参数检查
  if(argc!=2)
  {
    printf("Input error!Try again:./%s <host IP>\n",argv[0]);
    exit(1);
  }
  //获取主机socket信息
  if(inet_aton(argv[1],&serv_addr.sin_addr)==-1)
  {
    perror("inet_aton");
    exit(1);
  }
  if((host=gethostbyaddr((char *)&serv_addr.sin_addr,4,AF_INET))==NULL)
  {
    perror("gethostbyaddr");
    exit(1);
  }
  printf("%s\n",host->h_name);
  //创建socket数据结构
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  {
    perror("socket");
    exit(1);
  }
  //初始化服务器端socket
  memset(&serv_addr,0,socklen);
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_port=htons(PORT);
  serv_addr.sin_addr= *(struct in_addr *)(host->h_addr);//需要头文件#include<netdb.h>,要不提示错误:提领指向不完全类型的指针
  //向服务器发起连接
  if(connect(sockfd,(struct sockaddr *)&serv_addr,socklen)==-1)
  {
    perror("connect");
    exit(1);
  }
  else printf("connect success!\n");
  //sleep(2);
  //与服务器通信
  while(i<3)
  {
   if((n=recv(sockfd,buf,MAX_RECV,0))==-1) //搞清send和recv函数里的socket描述符,accept和connect函数的返回值
   {
     perror("recv");
     exit(1);
   }
   else
   {
     buf[n]='\0';
     printf("HOST:%s\n",buf);
   }
   if(strcmp(buf,"WRONG! Try again!")==0)i--;

   while(i<2)
   {
     if(fgets(user_info,MAX_INFO,stdin) == NULL)
     {
       printf("fgets error!\n");
       exit(1);
     }
     if(send(sockfd,user_info,strlen(user_info),0)==-1)
     {
       perror("send");
       exit(1);
     }
     break;
   }
   i++;
  }
  close(sockfd);
  return 0;

}
级别: 新手上路
UID: 5164
精华: 0
发帖: 37
金钱: 320 两
威望: 280 点
综合积分: 74 分
注册时间: 2009-04-12
最后登录: 2011-06-07
3楼  发表于: 2009-05-03 12:09
执行过程如下:

服务器端:
[root@FriendlyARM tcp_login]# ./server_arm                                      
socket success!,sockfd=3                                                        
bind success!                                                                  
listening...                                                                    
accept success!                                                                
Have sent:Your User ID:                                                        
recv: Transport endpoint is not connected                                      
errno=29                                                                        
Mesg:Illegal seek                                                              
[root@FriendlyARM tcp_login]#

客户端:
[root@YSQ-Fedora10 tcp_login]# ./client_x86 192.168.1.101
FriendlyARM
connect success!
HOST:Your User ID:

希望对你分析有用,hehe~~
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2009-05-03 12:21
抱歉,通常我是不分析的,我只负责让人把源代码贴出来,论坛里会有高手来分析,       
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 5164
精华: 0
发帖: 37
金钱: 320 两
威望: 280 点
综合积分: 74 分
注册时间: 2009-04-12
最后登录: 2011-06-07
5楼  发表于: 2009-05-03 12:33
不过还是谢谢你了!等待高手中......
这里补问一个问题,send()和recv()函数的第一个参数应填哪一方的套接字描述符,我的程序里服务器端send里填server的描述符发送不成功,而填client的可以,可这与网上的说法不一致阿?有点迷惑了
级别: 新手上路
UID: 5164
精华: 0
发帖: 37
金钱: 320 两
威望: 280 点
综合积分: 74 分
注册时间: 2009-04-12
最后登录: 2011-06-07
6楼  发表于: 2009-05-03 17:31
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
7楼  发表于: 2009-05-04 14:02
复制代码
  1.      //处理来自客户机的验证信息
  2.      while(iMsg<2)
  3.      {
  4.        bzero(buf,MAX_RECV);
  5.        if(recv(sockfd,buf,MAX_RECV,0)==-1)
  6.        {

这里是从client端接收消息,应该用recv(client_fd, ...)
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 6561
精华: 0
发帖: 7
金钱: 70 两
威望: 70 点
综合积分: 14 分
注册时间: 2009-06-06
最后登录: 2009-09-07
8楼  发表于: 2009-08-19 21:23
建议用select模型,这样直接链接的服务端不支持多链接,send()和recv()这两个函数都使用accept()返回的那个socket描述符    ,而在client端send()和recv()这两个函数都使用connet()链接的socket描述符