Chinaunix
标题:
TCP多client连接调试异常,请高手帮助,谢谢 !
[打印本页]
作者:
mini_peng
时间:
2015-02-16 00:24
标题:
TCP多client连接调试异常,请高手帮助,谢谢 !
本帖最后由 mini_peng 于 2015-02-16 00:28 编辑
写的TCP监听程序,单个用户连接时,一切正常。两个及以上TCP Client连接上时,只有第一个有反应。
于是baidu,有fcntl和select的方法。调试时发现只能接收client发来的第一个串,然后就不再响应。
何故??
(这是网上的例程,我copy来调试时也未通过,只能接收client的第一个串)
//---------------------------------------------
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#define SERVPORT 333
#define BACKLOG 10
#define MAX_CONNECTED_NO 10
#define MAXDATASIZE 100
int main()
{
socklen_t sock_len,*sin_size;
size_t recvbytes;
struct sockaddr_in server_sockaddr,client_sockaddr;
int flags;
int sockfd,client_fd;
char buf[MAXDATASIZE];
sock_len = sizeof(struct sockaddr);
sin_size = &sock_len;
/*创建socket*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
//if((sockfd = socket(AF_UNIX,SOCK_STREAM,0))==-1)
//if((sockfd = socket(AF_LOCAL,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
printf("socket success!,sockfd=%d\n",sockfd);
/*设置sockaddr结构*/
server_sockaddr.sin_family=AF_INET;
//server_sockaddr.sin_family=AF_UNIX;
server_sockaddr.sin_port=htons(SERVPORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
bzero(&(server_sockaddr.sin_zero),8);
/*将本地ip地址绑定端口号*/
if(::bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){
perror("bind");
exit(1);
}
printf("bind success!\n");
/*监听*/
if(listen(sockfd,BACKLOG)==-1){
perror("listen");
exit(1);
}
printf("listening....\n");
/*fcntl()函数,处理多路复用I/O*/
if((flags=fcntl( sockfd, F_SETFL, 0))<0)
perror("fcntl F_SETFL");
//flags |= O_NONBLOCK;
flags |= O_ASYNC;
if(fcntl( sockfd, F_SETFL,flags)<0)
perror("fcntl");
while(1)
{
//sin_size=sizeof(struct sockaddr_in);
//sock_len = sizeof(struct sockaddr_in);
//sin_size = &sock_len;
if((client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,sin_size))==-1)
{ //服务器接受客户端的请求,返回一个新的文件描述符
perror("accept");
exit(1);
}
if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
perror("recv");
exit(1);
}
if(read(client_fd,buf,MAXDATASIZE)<0){
perror("read");
exit(1);
}
printf("received a connection :%s",buf);
/*关闭连接*/
//close(client_fd);
//exit(1);
}/*while*/
}
作者:
hellioncu
时间:
2015-02-16 08:45
第二次循环你的程序应该阻塞在accept了,没有recv
作者:
mini_peng
时间:
2015-02-16 09:31
回复
2#
hellioncu
我step时,只见buf有一次值,可能就是你说的这情况。
我应accept置为 非阻塞模式?
作者:
hellioncu
时间:
2015-02-16 09:36
mini_peng 发表于 2015-02-16 09:31
回复 2# hellioncu
我step时,只见buf有一次值,可能就是你说的这情况。
用最基本的select模型,找本书或者网上找点文章看看,好过你这么瞎折腾
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2