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