【问题标题】:Client side problems with recvfrom functionrecvfrom 函数的客户端问题
【发布时间】:2014-03-17 15:44:46
【问题描述】:

各位,

我被这个问题困扰了很长时间,请帮助!我在一台笔记本电脑上有服务器,它正在向另一台笔记本电脑上的客户端发送数据,相同的局域网。我可以在服务器端和客户端的wireshark上看到udp数据包......但问题出在代码中,客户端只是卡在“ printf(“Opening datagram socket ....OK.\n”); "为什么代码不能 printf 从服务器接收到 buf?正如我所说,数据包在wireshark中可见,这让我感到困惑:S

请给点建议...

int main(){

struct sockaddr_in srv_addr;
int sd,fd,datalen,numRead;
ssize_t nbytes,numWrite;
socklen_t addrlen=sizeof(struct sockaddr_in);
char buf[MAX_SIZE],tmp[MAX_SIZE];


if((sd = socket(AF_INET, SOCK_DGRAM, 0))<0){
    printf("Opening datagram socket error",strerror(errno));
    return 1;

}else{
    printf("Opening datagram socket....OK.\n");
}

memset((char *) &srv_addr, 0, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(PORT_NUM);
srv_addr.sin_addr.s_addr = inet_addr(IP_SERVER);
memset(buf,0,MAX_SIZE);

while(1){

   nbytes = recvfrom(sd,buf,MAX_SIZE,0,(struct sockaddr *)&srv_addr, &addrlen);

    if(nbytes != -1){

        printf("The %s message from server\n",buf);


}else{

    printf("Recvfrom error %s\n",strerror(errno));    

}

return 0;

}

【问题讨论】:

  • 您的代码缺少右大括号 (})。

标签: c sockets udp


【解决方案1】:

您错过了一个bind() 电话。

bind(sd, (SOCKADDR*) &srv_addr, sizeof (srv_addr));

两端总是需要绑定,否则您的套接字将不知道它在哪个端口/接口上运行。

此外,您必须将 Socket 绑定到本地计算机上的接口。 srv_addr.sin_addr.s_addr = inet_addr(IP_SERVER); 定义接口,由其 IP 标识,Socket 绑定并监听。如果您想限制通信伙伴,您必须检查 recvfrom(第 5 个参数)返回的 sockaddr 结构

inet_addr(IP_SERVER) 替换为htonl(INADDR_ANY)。这将告诉您的套接字侦听本地计算机上可用的每个接口。

【讨论】:

  • 很好,它解决了问题,谢谢。我认为绑定仅在服务器端就足够了,我是新的套接字......但是当我添加绑定并将地址更改为 INADDR_ANY 时,它工作得很好!再次感谢
  • 由于您是套接字编程的新手,我添加了一些进一步的解释。我希望这能帮助您了解发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2021-02-25
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多