c - 服务器挂在 UDP 套接字的 recvfrom() 上(C,Windows)
问题描述
我正在尝试从我的客户端接收一些数据,而我的服务器在遇到 recvfrom() 函数时似乎挂起。我不知道出了什么问题,或者我的套接字设置是否有问题。我也在 Python 中对此进行了编码,它工作正常,并且似乎套接字设置相同。下面是有问题的完整代码,悬挂发生在底部。我是 C 新手,因此对任何混淆或白痴表示歉意。非常感谢您的帮助。
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define WIN32_LEAN_AND_MEAN
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
#include <winsock2.h>
#include <Ws2tcpip.h>
#include < ws2ipdef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define PORT 25678
#define STREAM "235.5.4.5"
int main(int argc, char* argv[]) {
int sockfd;
struct sockaddr_in sin, group;
int sin_len, done;
const int buffer_len = 1024;
char buffer[1024];
WSADATA wsaData;
printf("Initializing the winsock library ... ");
if (WSAStartup(MAKEWORD(1, 1), &wsaData) == SOCKET_ERROR) {
return -1;
}
memset(&sin, 0, sizeof(sin));
//1 create a socket
printf("Creating a socket ... ");
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) { perror("Error opening socket"); exit(1); }
//2 set generic socket options
u_int share;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &share, sizeof(share)) < 0) {
perror("setsockopt"); exit(1);
}
//3 bind the socket to the port
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin_len = sizeof(sin);
if (bind(sockfd, (struct sockaddr*)&sin, sin_len) < 0) {
exit(1);
};
//4 set up mreq
group.sin_family = AF_INET;
group.sin_port = htons(PORT);
group.sin_addr.s_addr = inet_addr(STREAM);
struct ip_mreq mreq;
mreq.imr_multiaddr = group.sin_addr;
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
//5 set the socket options to the mreq
if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
printf("ERROR adding membership");
exit(1);
}
done = 0;
int nb;
//6 listen
while (!done) {
//int recvfrom(int socket, char *buf, int buflen, int flags, struct sockaddr* addr, int* addrlen);
nb = recvfrom(sockfd, (char*)buffer, buffer_len, 0, (struct sockaddr*)&sin, &sin_len);
}
close(sockfd);
return(0);
}
解决方案
推荐阅读
- java - 使用java将从Postgres数据库收集的数据写入文本文件
- python - 使用 Scrapy 和 Splash 抓取带有“data-reactid”内容的 javascript
- wordpress - (在 Hostgator 中为 Wordpress 使用共享主机)安装失败:无法创建目录
- spring-data-jpa - Spring Boot 数据 jpa 应用程序启动失败
- python - GAN 没有很好地进行训练
- android - 在 Recyclerview 适配器类中调用自定义侦听器
- php - PHP中的密码散列不起作用
- mysql - 如何总计 3 个选择语句计数?
- python - python的apply()函数中的运行时错误
- javascript - Firebase 与 async/await 但我无法部署有一个错误,我可以使用 async