socket编程出现recv: Transport endpoint is not connected 错误,急???
服务器与客户端已经连通了,并且服务器发的第一条信息Your User ID:客户端已经收到,紧接着应该是服务器端等待客户端发过来的验证信息,可还没等客户端从键盘输入验证信息,服务器端就提示recv: Transport endpoint is not connected 错误,异常退出,而客户端仍处在等待用户键盘输入状态,是什么原因??高手请教,不胜感激!!!
源代码:
/* 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;
}
执行过程如下:
服务器端:
[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: