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

calerysq 2009-05-03 06:00:06
服务器与客户端已经连通了,并且服务器发的第一条信息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:
...全文
5219 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanleichicheng 2012-07-24
  • 打赏
  • 举报
回复
问题找到了,在server程序中recv和send的socket应该传递的是accept返回的客户端的socket;失败竟然能犯这种低级错误
shanleichicheng 2012-07-24
  • 打赏
  • 举报
回复
今天我也遇到相同的问题了,sockfd是没有错的?????
zf2371752658 2012-03-28
  • 打赏
  • 举报
回复
the same to you
libingwai 2009-05-11
  • 打赏
  • 举报
回复

//处理来自客户机的验证信息
while(iMsg <2)
{
bzero(buf,MAX_RECV);
if(recv(sockfd,buf,MAX_RECV,0)==-1)
recv这里用的sockfd错了吧

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧