C套接字:recv并同时发送

时间:2016-04-07 08:26:33

标签: c sockets select tcp network-programming

我正在尝试使用单个服务器和多个客户端方案创建客户端服务器聊天应用程序。我的服务器正在运行,但我无法使客户端正常工作。我正在使用select()函数来选择我应该recv()还是send()。这是我的客户端实现代码。

main()
{
int sockfd;
struct sockaddr_in serv_addr;

int i, sent;
char buf[100];
char buff[100];

/*
Opening a socket 
Check whether opening is successful or not
*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    printf("Unable to create socket\n");
}
printf("Socket created\n");


serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(6000);

/*
Establish a connection with the server process
*/
if((connect(sockfd, (struct socketaddr *)&serv_addr, sizeof(serv_addr)))<0){
    printf("Unable to connect to server\n");
    exit(0);
}

printf("Client connected\n");

while(1){

    for(i=0; i<100; i++){
        buf[i] = '\0';
        buff[i] = '\0';
    }

    fd_set rfd, wfd;
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 0;
    FD_ZERO( &rfd);
    FD_ZERO( &wfd);

    FD_SET( sockfd, &rfd);
    //FD_SET( sockfd, &wfd);
    FD_SET( 0, &wfd);

    if( (select( sockfd + 1, &rfd, &wfd, NULL, &tv) < 0)) {
        printf(" Select error \n");
        exit(0);
    }

    if( FD_ISSET( sockfd, &rfd)) { // we got data ... need to read it
        recv(sockfd, buff, 100, 0);
        printf("Received result from server = %s\n",buff);
    }

    if( FD_ISSET( 0, &wfd)) {
        fflush(stdin);
        printf(">");
        gets(buf);
        sent = send(sockfd, buf, strlen(buf) + 1, 0);
        printf("-------------Sent %d bytes to server--------------\n", sent);
    }
}
printf("----------------Closing client------------------ \n");
close(sockfd);
}

每个客户端都应该像聊天应用程序一样将一个客户端发送的消息发送到服务器。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

问题是您检查是否可以到标准输入文件描述符。这没有任何意义,你应该检查一下你是否可以读取

也就是说,您也应该将STDIN_FILENO添加到读取集中,而根本没有写入集。

答案 1 :(得分:0)

我几天前遇到了同样的问题,但是在c ++中。我的问题通过这些链接解决了:

可能你可以适应你的情况,这个套接字服务器可以根据需要进行广播。尝试编译它,你会看到它是如何工作的。

如果您需要帮助,请不要犹豫。