C 套接字:同时接收和发送

问题描述 投票:0回答:2

我正在尝试制作一个具有单服务器和多客户端场景的客户端服务器聊天应用程序。我的服务器正在工作,但我无法让客户端工作。我正在使用 select() 函数来选择是否应该 receive() 还是 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);
}

每个客户端都应该像聊天应用程序一样获取一个客户端发送到服务器的消息。

c sockets tcp network-programming posix-select
2个回答
2
投票

问题是您检查是否可以write到标准的input文件描述符。这没有任何意义,您应该检查是否可以从中读取

也就是说,您也应该将

STDIN_FILENO
添加到读取集,并且根本没有写入集。


0
投票

几天前我也遇到了同样的问题,但是是在 C++ 中。使用这些链接解决了我的问题:

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

如果您需要帮助,请随时询问。

© www.soinside.com 2019 - 2024. All rights reserved.