我正在尝试从我的客户端接收一些数据,但我的服务器在遇到 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);
}