我必须通过UDP连接到远程服务器并向其发送预定的消息以便收回消息。我首先在TCP中尝试了这个,但是在我发送消息并在recvfrom()中收听回复之后,它在UDP中工作,我什么都没得到。任何人都可以告诉我这里可能存在什么问题。
if ((bytes_sent = sendto(sockfd, UDP_MSG, strlen(UDP_MSG), 0, p->ai_addr, p->ai_addrlen)) == -1) {
perror("ClientUDP: Error sending data");
exit(1);
}
printf("Data sent %s\n", UDP_MSG);
len = sizeof(struct sockaddr_storage);
if ((bytes_recv = recvfrom(sockfd, bufudp, MAXDATASIZE-1, 0,(struct sockaddr*)&addr, &len)) == -1) {
perror("Error receiving in UDP");
exit(1);
}
printf("Bytes recv %d\n", bytes_recv);
bufudp[bytes_recv] = '\0';
printf("ClientUDP: Received\n %s \n",bufudp );
使用scanf()从键盘输入端口,消息为字符串“HI”。
答案 0 :(得分:1)
TCP和UDP不可互换。一些特定的协议使用两者(例如DNS),但是大部分都选择其中一个。 HTTP(S)建立在TCP之上,因为它需要双向流。许多音频/视频协议都建立在UDP之上,因为丢失/重新排序的数据包(偶尔)并不重要。
简而言之,您的服务器可能只侦听TCP端口,而不是UDP。
如果您知道该服务器正在侦听TCP和UDP,请检查两台计算机上和路由上的防火墙。
答案 1 :(得分:0)
如果您想查看UDP数据包是否正在使用正确的内容和地址离开您的计算机,我会安装Wireshark。此实用程序将捕获并解码计算机发送/接收的所有IP数据包。
有一个问题,recvfrom()会立即返回还是仅阻止?如果它立即返回,我会检查返回值是否为-1,如果是,则表示错误代码出现在errno中。