gpt4 book ai didi

c - VS2013中使用UDP套接字接收数据

转载 作者:行者123 更新时间:2023-11-30 15:30:11 25 4
gpt4 key购买 nike

我想通过端口 3702 接收 *.xml 数据。

所以我做了一个示例服务器。并通过三个端口1500,2500,3702发送数据。(编辑第43行的PORT)

它可以正常工作并从端口 1500,2500 打印数据。但是当我将 PORT 设置为 3702 时。

它返回了一个错误:**绑定(bind)失败,错误代码:10048**

我发现可能存在其他客户端IP通过我的LAN中的端口3702发送数据。我该如何修复它?

#include<stdio.h>
#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

#define BUFLEN 8192 //Max length of buffer
#define PORT 3702 //The port on which to listen for incoming data

int main()
{
SOCKET s;
struct sockaddr_in server, si_other;
int slen, recv_len;
char buf[BUFLEN];
WSADATA wsa;

slen = sizeof(si_other);

//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed. Error Code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");

//Create a socket
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("Could not create socket : %d", WSAGetLastError());
}
printf("Socket created.\n");

//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PORT);

//Bind
if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
printf("Bind failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
puts("Bind done");

//keep listening for data
while (1)
{
printf("Waiting for data...");
fflush(stdout);

//clear the buffer by filling null, it might have previously received data
memset(buf, '\0', BUFLEN);

//try to receive some data, this is a blocking call
if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)
{
printf("recvfrom() failed with error code : %d", WSAGetLastError());
//exit(EXIT_FAILURE);
}

//print details of the client/peer and the data received
printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
printf("Data: %s\n", buf);

//now reply the client with the same data

}

closesocket(s);
WSACleanup();
return 0;
}

最佳答案

这是由于地址已被使用所致。

通常,每个套接字地址(协议(protocol)/IP 地址/端口)仅允许使用一次。如果应用程序尝试bind,则会出现此错误到已用于现有套接字的 IP 地址/端口的套接字,或未正确关闭的套接字,或仍在关闭过程中的套接字。对于需要将多个套接字绑定(bind)到同一端口号的服务器应用程序,请考虑使用 setsockopt (SO_REUSEADDR)。

客户端应用程序通常根本不需要调用绑定(bind) - connect自动选择未使用的端口。当使用通配符地址(涉及ADDR_ANY)调用bind时,WSAEADDRINUSE错误可能会延迟,直到提交特定地址为止。稍后调用另一个函数可能会发生这种情况,包括 connectlisten , WSAConnect ,或WSAJoinLeaf .

关于c - VS2013中使用UDP套接字接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25740718/

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