udp socket通信,是不是一定要先開啟接收者行程recvfrom函式,在呼叫發送者sendto?先開啟發送者接收者就接收不到了。
還有recvfrom函式的第四個引數源地址(from)是輸出源地址還是要先指定源地址,指示從該源地址接收資料包呢/?
今天搞了一陣天,把from的地址填充才不會回傳-1。
//接收者
int waitsec(int sec)
{
while (sec>0) {
cout << sec << "s..." << endl;
sec--;
Sleep(1000);
}
return 0;
}
int main(int argc, char* argv[])
{
char buf[10] = { 0 };
int ret;
int len;
WSADATA data;
WSAStartup(MAKEWORD(2, 2), &data);
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
cout << sock << endl;
SOCKADDR_IN locaddr;
SOCKADDR_IN sendaddr = { 0 };
len = sizeof(SOCKADDR_IN);
locaddr.sin_port = htons(4000);
locaddr.sin_family = AF_INET;
locaddr.sin_addr.S_un.S_addr = inet_addr("192.168.4.35");
sendaddr.sin_port = htons(4000);
sendaddr.sin_family = AF_INET;
sendaddr.sin_addr.S_un.S_addr = inet_addr("192.168.4.35");
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&locaddr, TRUE);
ret = bind(sock, (SOCKADDR*)&locaddr, sizeof(SOCKADDR_IN));
cout << ret << endl;
while (1) {
cout << "receive star" << endl;
ret = recvfrom(sock, buf, 9, 0,(SOCKADDR*)&sendaddr,&len);
cout << "receive end" << endl;
cout << buf << endl;
cout << "IP Address : " << inet_ntoa(sendaddr.sin_addr) << " Port : " << ntohs(sendaddr.sin_port) << endl;
cout << "recv : " << ret << endl;
waitsec(1);
}
closesocket(sock);
WSACleanup();
return 0;
}
//發送者
int waitsec(int sec)
{
while (sec>0) {
cout << sec << "s..." << endl;
sec--;
Sleep(1000);
}
return 0;
}
int main(int argc, char* argv[])
{
char tmp[100] = { 0 };
int ret;
int len;
WSADATA data;
WSAStartup(MAKEWORD(2, 2), &data);
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN locaddr, recvaddr;
locaddr.sin_port = htons(4000);
locaddr.sin_family = AF_INET;
locaddr.sin_addr.S_un.S_addr = inet_addr("192.168.4.35");
recvaddr.sin_port = htons(4000);
recvaddr.sin_family = AF_INET;
recvaddr.sin_addr.S_un.S_addr = inet_addr("192.168.4.35");
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&locaddr, TRUE);
bind(sock, (SOCKADDR*)&locaddr, sizeof(SOCKADDR_IN));
len = sizeof(SOCKADDR_IN);
while (1) {
cout << "sendto star" << endl;
ret = sendto(sock, "sender", 6, 0, (SOCKADDR*)&recvaddr, sizeof(SOCKADDR_IN));
cout << "sendto end" << endl;
cout << "IP Address : " << inet_ntoa(recvaddr.sin_addr) << " Port : " << ntohs(recvaddr.sin_port) << endl;
cout << "send : " << ret << endl;
waitsec(5);
/*cout << "receive star" << endl;
ret = recvfrom(sock, tmp, 100, 0, (SOCKADDR*)&recvaddr, &len);
cout << "receive end" << endl;
cout << "LEN = " << ret << endl << tmp << endl;*/
}
closesocket(sock);
WSACleanup();
return 0;
}
uj5u.com熱心網友回復:
不是一定要先開啟接收者行程recvfrom函式,在呼叫發送者sendto還有recvfrom函式的第四個引數源地址(from)是函式自己填充,它收到什么IP發的資料,就填上什么IP
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/129781.html
標籤:網絡協議與配置
上一篇:華為開發者社區活動-有獎注冊活動
