- 论坛徽章:
- 3
|
本帖最后由 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*/
} |
|