首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测客户端断开连接

检测客户端断开连接
EN

Stack Overflow用户
提问于 2015-12-28 12:39:45
回答 2查看 224关注 0票数 0

我有一个听套接字的简单程序。除了在while(1)循环中连接丢失时,一切都进行得很好。在这种情况下,程序多次从套接字进入读,但没有结果。如何在while(1)循环中检测断开连接的客户端?

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include<string.h>


void printHex(char * bts  )
{
    char *s = bts;
    int i=0;
    do
    {
        printf("%02X ", (unsigned char  ) *bts);

    } while (* ++bts !=0);
    printf("%s\n",s);

}


int main()
{
    char str[100];
    int listen_fd, comm_fd;

    struct sockaddr_in servaddr;

    listen_fd = socket(AF_INET, SOCK_STREAM, 0);

    bzero( &servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY);
    servaddr.sin_port = htons(22000);
    printf("binding\n");

    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    printf("listening\n");

    listen(listen_fd, 10);
    printf("accepting\n");

    comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
    printf("accep done\n");

    int cn =0;

    while(1)
    {

        bzero( str, 100);
        printf("will read\n");
        int br= read(comm_fd,str,100);
        printf("read done\n");

        if (br>0)
        {
            printHex(str);
        }

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-28 12:41:56

更改:

代码语言:javascript
复制
    if (br>0)
    {
        printHex(str);
    }

至:

代码语言:javascript
复制
    if (br<=0) break;
    printHex(str);

此外,您的代码错误地处理了第一个字节为零的情况。您无法避免这种情况,因为TCP不保留应用程序消息边界。您应该将br传递给printHex,这样它就会知道要打印多少个字符。

票数 2
EN

Stack Overflow用户

发布于 2015-12-28 12:41:50

您需要检查read()的结果。如果连接关闭,您将得到该连接的返回代码。

来自手册页

如果出现错误,则返回-1,并适当设置errno。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34493714

复制
相关文章

相似问题

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