c++不能接收udp报文(Socket)
C++ cant receive UDP-Packets (Socket)
我正在研究一个c++ UDP程序,它发送一个字符串到另一个客户端,应该收到一个答案。
发送工作正常,但我无法接收任何数据包。我用wireshark查看了一下,我的电脑在正确的端口和正确的IP上收到了数据包,但我的程序似乎忽略了它们。
你知道吗?
int startWinsock(void);
int main()
{
long receive;
SOCKET sock;
char buffer[256];
SOCKADDR_IN si_me;
SOCKADDR_IN si_other;
///////////// Start Winsock ///////////////
receive = startWinsock();
if (receive != 0)
{
printf("Error: startWinsock, error code: %dn", receive);
return 1;
}
else
{
printf("Winsock started!n");
}
//////////// Create UDP Socket //////////////
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET)
{
printf("Fehler: Socket could not be created, errorcode: %dn", WSAGetLastError());
return 1;
}
else
{
printf("UDP Socket created!n");
}
si_me.sin_family = AF_INET;
si_me.sin_port = htons(1198);
si_me.sin_addr.s_addr = htonl(INADDR_ANY);
si_other.sin_family = AF_INET;
si_other.sin_port = htons(2000);
si_other.sin_addr.s_addr = inet_addr("10.2.134.10");
receive = connect(sock, (SOCKADDR*)&si_other, sizeof(SOCKADDR));
if (receive == SOCKET_ERROR)
{
cout << "Error : Connection Failed, Errorcode: " << WSAGetLastError() << endl;
}
else
{
cout << "Connected to" << si_other.sin_addr.s_addr << endl;
}
static int timeout = 500;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
// char broadcast = 1;
// setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));
while (1)
{
printf("Insert Text: ");
gets(buffer);
//rc = sendto(s, buf, strlen(buf), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
receive = send(sock, buffer, strlen(buffer), 0);
if (receive == SOCKET_ERROR)
{
//printf("error: sendto, error code: %dn",WSAGetLastError());
printf("Error: send, error code: %dn", WSAGetLastError());
//return 1;
}
else
{
printf("%d bytes sent!n", receive);
}
static int timeout = 500;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
int wait = 0;
while (wait == 0)
{
//rc = recvfrom(s, buf, 256, 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
receive = recv(sock, buffer, sizeof(buffer), 0);
if (receive == SOCKET_ERROR)
{
//printf("Fehler: recvfrom, fehler code: %dn",WSAGetLastError());
printf("Fehler: recv, fehler code: %dn", WSAGetLastError());
//return 1;
}
else
{
wait = 1;
printf("%d bytes received!n", receive);
buffer[receive] = ' ';
printf("Received: %sn", buffer);
}
}
}
getchar();
return 0;
}
int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2, 0), &wsa);
}
要使您的代码几乎按原样发送给自己,请执行以下操作:
- 更改"me"端口以匹配"other"…
si_me.sin_port = htons( 2000 );
- 绑定到它…
bind( sock, (SOCKADDR*)&si_me, sizeof( SOCKADDR ) );
在connect
之前
由于UDP是面向数据报和无连接的,您需要使用recvfrom/sento而不是recv/send。此外,receivetimeout应该设置为at timeval。
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
相关文章:
- C/C++:socket() 创建在循环中失败,打开的文件太多
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- 通过 Tor 服务C++ socket.io 客户端
- 操作系统 (Linux) 在使用 boost::asio::generic::raw_protocol::socket
- Make zmqpp::socket::connect a std::future
- 为什么可以重复使用这个boost::asio::tcp::socket
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- Socket.io客户端C++,从Socket.on获取数组
- 调用socket.remote_endpoint(提升 asio 库)线程安全性
- 如何使用已经存在的 tcp::socket 创建 tcp::iostream?
- 节点.js到 c++ 客户端:不接收来自 socket.emit 的消息
- 将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 时出错?
- 我可以在不包含 <sys/socket.h> 的情况下使用 C 套接字吗?
- 如何使用C 在socket.io中接收数据
- 通过 Socket 通过 boost asio 发送和接收 protobuf 数据
- shutdown() 和 closesocket() 在 SOCKET 上的 send() 之后不久
- 尝试在 Kdevelop中调试时如何修复"WebConnect: Starting server failed. Try to remove stale socket."?
- UDP Socket programmaing c++ Recvfrom() function error
- 提振.ASIO UDP socket:接收所有报文
- c++不能接收udp报文(Socket)