gpt4 book ai didi

recvfrom 函数的客户端问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:56 29 4
gpt4 key购买 nike

伙计们,

这个问题困扰我好久了,求大神指点!我在一台笔记本电脑上有服务器,它正在将数据发送到另一台笔记本电脑上的客户端,同一个局域网。我可以在服务器端和客户端的 wireshark 上看到 udp 数据包......但问题出在代码中,客户端只是停留在行“printf(“打开数据报套接字......好的。\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;

}

最佳答案

您缺少 bind() 调用。

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

绑定(bind)在两端总是必要的,否则你的套接字将不知道它在哪个端口/接口(interface)上运行。

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

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

关于recvfrom 函数的客户端问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22458833/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com