首页 > 解决方案 > 为什么接受命令不是套接字中的 euqal 连接命令?

问题描述

首先,我编写了一个服务器和一个客户端线程,参考Beej's Guide to Network Programming

我做了一些改变如下:

服务器.c

void *server(void *pdata){
...
printf("server ----> 1\n");
// wait for accept
printf("server ----> 2\n");
...
}

客户端.c

void *client( void *pdata ){
...
printf("client ----->(%d) 1\n", gettid( ));
// wait for accept
printf("client ---->(%d) 1\n", gettid( ));
...
}

主程序

int main( int argc, char *argv[] ){
    pthread_t serverid;
    pthread_t id;
    void *tmp;

    pthread_create( &serverid, NULL, server, NULL );

    sleep(1);
    pthread_create( &id, NULL, client, NULL );
    pthread_create( &id, NULL, client, NULL );

    pthread_join( serverid, &tmp );

    return 0;
}

当我运行这个测试用例时,有时我会得到这样的正确顺序:

server ----> 1
client ----->(36317) 1
client ----->(36318) 1
client ----->(36317) 2
client ----->(36318) 2
server ----> 2
server ----> 1
server ----> 2
server ----> 1

但是,在一半的时间里,结果看起来像这样:

server ----> 1
client ----->(36347) 1
client ----->(36348) 1
client ----->(36348) 2
client ----->(36347) 2
server ----> 2
server ----> 1
server ----> 2
server ----> 1

我的问题是为什么我可以得到 TCP 请求的非严格顺序。

标签: csockets

解决方案


这根本与网络无关。线程不能保证按照您指定的顺序启动,所以这很正常。请阅读有关线程的信息,如果可能的话,请阅读有关 POSIX 线程的信息,以便您获得更好的洞察力。


推荐阅读