【问题标题】:Socket programming C(Linux Ubuntu)套接字编程 C(Linux Ubuntu)
【发布时间】:2013-12-19 10:35:01
【问题描述】:

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

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

在这里,我使用了与发送相同的套接字。我需要创建一个新的来收听吗?

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));

【问题讨论】:

  • 您能在连接和发送/接收的位置显示更多代码吗?
  • while循环里面只有两行。
  • 所以假设你想编写某种聊天系统,你可能需要一个接收线程,在等待用户输入时检查套接字的数据
  • 您希望这个atoi("127.0.0.1") 做什么。在单独的程序中对其进行测试。

标签: c linux sockets ubuntu p2p


【解决方案1】:

我需要创建一个新的来收听吗?

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

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

【讨论】:

  • 要从服务器发送消息,我是否还需要创建一个用于发送的套接字。现在,我的服务器代码只有一个套接字。
  • @Andrew,不。一旦您接受了连接,您就可以使用该套接字发送数据。套接字是双向的,但(大多数时候,对于 SOCK_STREAM)具有固定端点。
  • 我创建了一个新套接字,但由于某种原因它无法正常工作。我在帖子中添加了初始化套接字结构的代码。
  • 如果您从机器外部连接,请将“127.0.0.1”替换为“0.0.0.0”。如果没有,请显示您调用 bind 和 listen 的代码,因为这看起来没问题。
【解决方案2】:

您的程序的问题在于您正在使用阻塞式 I/O 调用,当您想要不同于严格的请求 - 回复机制时,这很难管理。例如,当fgets 正在等待用户输入时,您不会窥视网络,也不会收到发送给您的消息,直到fgets 完成,并且只有当用户点击Enter 时。如果用户一个小时没有按任何键,您的程序将在fgets 中等待一个小时。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2016-02-09
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多