【发布时间】:2015-06-09 05:32:11
【问题描述】:
这是我第一次提出问题,也是第一次仅通过搜索此网站找不到答案。所以,如果我做错了,请放轻松。 使用温索克。我需要向另一台运行相同程序的计算机发送和接收信息包。连接类型应该是 UDP(我猜是非阻塞的?)并使用数据耦合模型。 我需要使用不同的线程发送和接收信息吗? 我知道数据发送得很好,但根本没有收到。
我可以轻松地在程序发送和完全不同的程序接收,但似乎这些原则并没有延续到我想要做的事情。
我应该对 recvfrom 和 sendto 使用相同的 sockaddr_in 结构吗?或者他们可以使用同一个吗?斯伦呢?没关系,我都试过了,但都没有工作。我试过用一个端口发送和一个接收,我试过用一个端口来做这两个。没有。我对 Winsock 比较陌生,如果我听起来绝望或遗漏了一些非常明显的东西,我很抱歉。在这一点上,我真的需要一些帮助,或者至少需要一个正确的方向我不在乎有多少端口我只想看到带有正确数据的 recv printf 传入。
winsock 错误是 绑定失败10048,recv失败10022
我还要提到我研究了 MSDN 建议的名为 setsockopt 的概念,但它最终使我更加困惑。我错过了什么吗?
这里有一些相关的功能。
void UDPNetwork::initserver()
{
initRemote();
slen2= sizeof(si_other);
if ((_recvSocket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("failed to create socket: %d", WSAGetLastError());
}
_recvSocket = (AF_INET, SOCK_DGRAM, 0);
memset((char *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PORT);
if (bind(_recvSocket, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
printf("Bind failed with error code : %d",
WSAGetLastError());
/* system("PAUSE");
exit(EXIT_FAILURE);*/
}
}
void UDPNetwork::initclient(){
slen = sizeof(si_other);
_sendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (_sendSocket == SOCKET_ERROR)
{
printf("failed to create socket... ");
exit(EXIT_FAILURE);
}
memset((char *)&si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
}
void UDPNetwork::send(float x, float y, float z)
{
sprintf(bufOut,"%f,%f,%f", x, y, z);
if (sendto(_sendSocket, bufOut, strlen(bufOut), 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)
{
printf("sento() failed with error code : d%", WSAGetLastError());
exit(EXIT_FAILURE);
}
//printf("Sent: %s\n", bufOut);
}
void UDPNetwork::recv(char *msg)
{
float ax = 0; float ay = 0; float az = 0;
memset(msg, '\0', BUFLEN);
recv_len = recvfrom(_recvSocket, msg, BUFLEN, 0, (struct sockaddr*) &si_other, &slen);
int nError = WSAGetLastError();
if (nError != WSAEWOULDBLOCK&&nError != 0);
{
printf("Recv failed with error code : %d",
WSAGetLastError());
//system("PAUSE");
//exit(EXIT_FAILURE);
}
recv = buf;
sscanf_s(msg, "'%f,%f,%f", &ax,&ay,&az);
printf("RECV: %f %f %f\n", ax, ay, az);
}
【问题讨论】:
-
这行代码应该做什么:
_recvSocket = (AF_INET, SOCK_DGRAM, 0);? -
错误是
WSAEADDRINUSE和WSAEINVAL。与bind和recv函数参考一起阅读它们可能是一个好的开始。 -
是的,这是 MSDN 告诉我查看 setsockopt 的地方,但我不知道为什么或应该用它做什么。大约有 50 种不同的插座选项。即使在 MSDN 上,我似乎也找不到关于如何使用它的好参考。(如示例)。 setsockopt 真的是实现数据耦合模型的唯一方法吗?
-
@Mac
bind(_recvSocket)错误很可能是由我指出的代码行引起的。写_recvSocket = 0;只不过是一种混淆的方式。 -
另外,
recvfrom调用可能会修改地址长度参数,你应该在每次调用之前设置它。
标签: c++ sockets client server winsock