首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中UNIX域套接字编程,打印问题

C中UNIX域套接字编程,打印问题
EN

Stack Overflow用户
提问于 2015-05-10 09:28:28
回答 1查看 151关注 0票数 1

我的服务器出现打印问题。我希望当我在终端上有2个或更多活动的客户端时,可以同时打印。但是,我一次只能从一个客户端打印。一旦我关闭了一个客户端,其他客户端就可以自由地写入服务器了。我可以做什么来解决我的问题?

我尝试过分叉打印部分,我认为这并没有真正起到什么作用。(我刚刚意识到,如果我这样做,那么select系统调用是一种浪费,我宁愿使用select系统调用) *edit

代码语言:javascript
复制
while(TRUE) {

    FD_ZERO(&readfds);

    FD_SET(socket1, &readfds);
    FD_SET(socket2, &readfds);
    FD_SET(socket3, &readfds);

    select(socket3+1, &readfds, NULL, NULL, NULL);

    //add socket1
    if(FD_ISSET(socket1, &readfds)) {
        if((client_socket1 = accept(socket1, NULL, NULL)) < 0) {
            perror("accept1");
            exit(EXIT_FAILURE);
        }
        printf("New Connection\n");

        puts("Welcome message1 sent successfully\n");
    }

    //add socket2
    if(FD_ISSET(socket2, &readfds)) {
        if((client_socket2 = accept(socket2, (struct sockaddr *)&addr2, (socklen_t*)&addr2)) < 0) {
            perror("accept2");
            exit(EXIT_FAILURE);
        }
        printf("New Connection\n");

        puts("Welcome message2 sent successfully\n");
    }

    //add socket 3
    if(FD_ISSET(socket3, &readfds)) {
        if((client_socket3 = accept(socket3, (struct sockaddr *)&addr3, (socklen_t*)&addr3)) < 0) {
            perror("accept3");
            exit(EXIT_FAILURE);
        }
        printf("New Connection\n");

        puts("Welcome message3 sent successfully\n");
    }

    //print from socket 3
    while( (ready = read(client_socket3, buffer, sizeof(buffer))) > 0) {
        printf("%s\n", buffer);
    }

    //print from socket 2
    while( (ready = read(client_socket2, buffer, sizeof(buffer))) > 0) {
        printf("%s\n", buffer);
    }

    //print from socket 1
    while( (ready = read(client_socket1, buffer, sizeof(buffer))) > 0) {
        printf("%s\n", buffer);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-05-10 10:40:55

在尝试读取客户端套接字之前,需要将它们添加到fd_setselect语句中。另外,你应该让你所有的套接字都是非阻塞的。否则,read调用将被阻塞,直到您获得数据。

这里有一个快速修复方法,它使用recv而不是read来读取套接字,但使用MSG_DONTWAIT作为异步标志。

我没有看到您关闭客户端套接字或正确处理错误的任何地方。所以我插入了一些代码作为提示。此外,直接“打印”来自套接字的数据缓冲区也不是一个好主意。因为你永远不知道你收到的数据是否是null终止的。在从套接字读取数据后,始终为空,终止缓冲区。

更改以下代码块:

代码语言:javascript
复制
//print from socket 3
while( (ready = read(client_socket3, buffer, sizeof(buffer))) > 0) {
    printf("%s\n", buffer);
}

要这样做:

代码语言:javascript
复制
while (1)
{
    int result;
    result = recv(client_socket3, buffer, sizeof(buffer)-1, MSG_DONTWAIT);
    if ((result == -1) && 
             ((errno == EAGAIN) || (errno==EWOULDBLOCK)) )
    {
        // no more data available, but could be available later
        // use the socket with "select" above to wait for more data
    }
    else if ((result == -1) || (result == 0))
    {
        // remote close or unrecoverable error
        close(client_socket3);
        client_socket3=-1;
    }
    else
    {
        // null terminate the buffer before printing
        buffer[result] = '\0';
        printf("%s\n", buffer);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30146760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档