Socket编程C(Linux Ubuntu)

我正在编写一个使用TCP通过networking进行通信的程序。 如果用户提供ip地址作为命令行参数,程序将尝试连接到该地址。 如果没有,它将等待其他人连接。 为了清楚起见,即使它是p2p连接,我将调用等待其他人连接作为服务器和另一个作为客户端。 服务器没有问题接收客户端发送的任何文本消息。 但是,客户端只有在发送自己的消息时才会收到来自服务器的文本消息。 我如何解决这个问题,让客户端立即收到消息? 这是我的代码片段

a.sin_family = AF_INET; a.sin_addr.s_addr = iet_addr(SERVER_IP); addr.sin_port = htons((unsigned short)SERVER_PORT); 

在这里,我使用了用于发送的相同套接字。 我需要创build一个新的听力?

 fgets(buffer,sizeof(buffer),stdin); send(socket,buffer,strlen(buffer),0); b = recv(socket,buffer,sizeof(buffer),0); buffer[b] = 0; printf("%s",buffer); 

编辑:这是为了监听套接字

 add.sin_family = AF_INET; add.sin_addr.s_addr = htonl(atoi("127.0.0.1")); add.sin_port = htons((unsigned short)NEWPORT); 

编辑:这是绑定代码

 bind(socket,(struct sockaddr *)&add,sizeof(add)); 

我需要创建一个新的听力?

是的,因为套接字将被绑定到不同的地址。

您可以通过该套接字从服务器接收数据,但要接受新的连接,您需要一个侦听器套接字和每个其他客户端的一个套接字。 请记住,套接字是通信的端点

你的程序的问题是,你正在使用阻塞的I / O调用,当你想要一些与严格的请求 – 回复机制不同的东西时,这很难管理。 例如,当fgets正在等待用户输入时,您不会偷看网络,并且在fgets完成之前,您将不会收到发送给您的消息,只有当用户点击Enter 。 如果用户在一个小时内没有按任何键,你的程序将在fgets等待一个小时。

为了达到这个目的,你必须将网络代码从用户输入代码中分离出来(你不能等待其中的任何一个无限地阻止来自另一个的流量)。 通常,这可以通过使用线程来完成(所以阻塞的I / O调用阻塞了一个线程),或者使用非阻塞的I / O(因此没有I / O调用阻塞任何东西)。 在使用C时,我会选择后者。