Chinaunix
标题:
一个并发socket通讯问题?
[打印本页]
作者:
shijunbiao
时间:
2009-07-19 17:49
标题:
一个并发socket通讯问题?
在AS4上的一个socket通讯程序,主要源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#define MY_PORT 8888
int main(int argc ,char **argv)
{
int listen_fd,accept_fd;
struct sockaddr_in client_addr;
int n;
if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket Error:%s\n\a",strerror(errno));
exit(1);
}
bzero(&client_addr,sizeof(struct sockaddr_in));
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(MY_PORT);
client_addr.sin_addr.s_addr=htonl(INADDR_ANY);
setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
if(bind(listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0)
{
printf("Bind Error:%s\n\a",strerror(errno));
exit(1);
}
listen(listen_fd,5);
while(1)
{
accept_fd=accept(listen_fd,NULL,NULL);
if((accept_fd<0)&&(errno==EINTR))
continue;
else if(accept_fd<0)
{
printf("Accept Error:%s\n\a",strerror(errno));
continue;
}
if((n=fork())==0)
{
.....
close(accept_fd);
exit(0);
}
else if(n<0)
printf("Fork Error:%s\n\a",strerror(errno));
close(accept_fd);
}
}
现在碰到一个问题,我客户端是用delphi实现的,连续调用该服务(2000次)时,客户端就会突然报出Socket Error # 10054Connection reset by peer的错误,而且每次报错的位置都不一样,请教什么原因,如何处理,谢谢
作者:
rollin7
时间:
2009-07-19 18:38
是否超过TCP连接数最大限制了?
用它试试if((listen_fd=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP))<0)
或者是连接时间太长,服务端关闭了与客户端的连接。
作者:
shijunbiao
时间:
2009-07-19 20:21
您的意思是不是子进程在操作逻辑的时候,父进程正好将套接字关闭导致的?
作者:
zpp71
时间:
2009-07-19 21:34
......
if((n=fork())==0)
{
.....
close(accept_fd);
/* 子进程close一次 */
exit(0);
}
else if(n<0)
printf("Fork Error:%s\n\a",strerror(errno));
close(accept_fd);
/* 父进程又close一次 */
作者:
bripengandre
时间:
2009-07-19 22:50
标题:
回复 #4 zpp71 的帖子
嗯,确实是这样,服务端误关了socket,估计客户端没检查FIN,直接给已关闭的套接口发数据,就收到对端的RST了~~
作者:
ddkkd
时间:
2009-07-20 08:25
标题:
回复 #1 shijunbiao 的帖子
10054 呵呵,咋这么像windows的错呀,是linux吗。
楼主是不是服务器直接挂了,多打印些信息。看看是不是服务器还在跑
作者:
shijunbiao
时间:
2009-07-20 12:56
已经解决了,查实是delphi的socket控件存在问题,服务端没有问题,谢谢各位。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2