当前位置:  开发笔记 > 前端 > 正文

使用select()函数在C语言中进行套接字编程

如何解决《使用select()函数在C语言中进行套接字编程》经验,为你挑选了1个好方法。

根据我从这个帖子得到的答案,我创建了这个:

    //Server 

    sock_init(); //from SFL, see http://legacy.imatix.com/html/sfl/

    timeout = 50000;

    serv_sock_input[0] = TCP(1234); 
    serv_sock_input[1] = UDP(9876);

    input_protocols[0] = "tcp";
    input_protocols[1] = "udp";

    while (1)
    {
        FD_ZERO(&sock_set);
        for (x = 0; x


int TCP (unsigned short port)
{
    int sock;                        
    struct sockaddr_in servAddr; 

    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        exit(1);

    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family = AF_INET;         
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(port);            

    if (bind(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
        exit(1);

    if (listen(sock, 5) < 0)
        exit(1);

    return sock;
}

int UDP (unsigned short port)
{
    int sock;                        /* socket to create */
    struct sockaddr_in servAddr; /* Local address */

    /* Create socket for sending/receiving datagrams */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        exit(1);

    /* Construct local address structure */
    memset(&servAddr, 0, sizeof(servAddr));   /* Zero out structure */
    servAddr.sin_family = AF_INET;                /* Internet address family */
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
    servAddr.sin_port = htons(port);      /* Local port */

    /* Bind to the local address */
    if (bind(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
        exit(1);


    return sock;
}

//Client
sock_init();

    if ((client_sock_output = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        exit(1);

    memset(&client_addr, 0, sizeof(client_addr));
    client_addr.sin_family      = AF_INET;
    client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    client_addr.sin_port        = htons(1234);

    if (connect(client_sock_output, (struct sockaddr *) &client_addr, sizeof(client_addr)) < 0)
        exit(1);

    closesocket(client_sock_output);

    sock_term();

服务器启动时,服务器在if(select(...))语句处被阻止.

因此,当我运行服务器,然后运行客户端时,客户端连接到服务器(有时在连接之前需要几次运行客户端).然后if(select...))声明不再是真的,它继续前进到其他地方.

之后,客户端关闭连接和程序.但是,这就是我的问题发生的地方,if(select(...))语句总是错误的.我得到这个输出:

Request on port 0:  
Input TCP Port 0  

Request on port 1:  
Input UDP Port 1

此输出将永远重复.为什么它不会卡在if(select(...))



1> 小智..:

您有两个问题:您不了解accept()如何在TCP中工作,您需要读取UDP中的传入数据.

select()告诉你一个监听套接字有连接接受,或者读取套接字有要读取的数据.

要让select停止告诉您,您需要实际读取数据或接受连接.

在UDP分支中,您需要调用receiv来实际获取数据.如果不这样做,选择会一直告诉您有数据.

在TCP分支中,调用accept_socket.我不知道你的实现是什么,但是关闭你刚刚调用accept()的套接字可能是错误的.accept()为您返回一个新的套接字 - 您应该用于IO的套接字.如果需要关闭任何东西,那就是新的套接字.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有