클라이언트 인 C++의 UDP 소켓과 한 번에 서버에서 작업하고 있습니다. Visual Studio 2017을 사용하고 Windows 7에서 실행합니다. "invalid argument"오류로 끝나는 recvfrom() 함수에 몇 가지 문제가 있습니다. 난 소켓 괜찮아 sockaddr_in 구조체 괜찮아요, 스레드 괜찮아요, 심지어 sendto() 함수와 함께 while 루프 괜찮아요 생각합니다. 그러나winsock2 : recvfrom() 함수가 10022 오류로 끝납니다 (잘못된 인수)
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <thread>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
void printMessage(SOCKET s, SOCKADDR_IN destAddr) {
char message[100];
int result, error;
int addrSize = sizeof(destAddr);
do {
printf("som v threade\n");
result = recvfrom(s, message, 100, 0, (SOCKADDR*)&destAddr, &addrSize);
printf("%d\n", result);
if (result < 0) {
error = WSAGetLastError();
printf("%d\n", error);
}
if (result > 0)
printf("%s", message);
} while (result > 0);
}
int main(int argc, char *argv[]) {
WORD dllVersion = MAKEWORD(2, 1);
WSADATA wsaData;
if (WSAStartup(dllVersion, &wsaData) != 0) {
printf("Winsock startup failed");
exit(1);
}
const char *ip = "127.0.0.1";
int dstPort = 49999;
int srcPort = 49999;
SOCKADDR_IN destaddr, srcaddr;
SOCKET s;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s < 0) {
printf("Error creating socket");
exit(1);
}
destaddr.sin_family = AF_INET;
destaddr.sin_addr.s_addr = inet_addr(ip);
destaddr.sin_port = htons(dstPort);
srcaddr.sin_family = AF_INET;
srcaddr.sin_addr.s_addr = htonl(INADDR_ANY);
srcaddr.sin_port = htons(srcPort);
bind(s, (SOCKADDR*)&srcaddr, sizeof(srcaddr));
thread receiving (printMessage, s, destaddr);
receiving.detach();
while (1) {
char message[100];
printf("Write a message:");
scanf("%s", message);
if (sendto(s, message, sizeof(message), 0, (SOCKADDR *) &destaddr, sizeof(destaddr)) < 0) {
printf("Message not sent");
exit(1);
}
}
return 0;
}
당신은'바인딩 오류 검사되지 않습니다()':
이와 비슷한 더 많은 것을보십시오. 'printf()'나 다른 시스템 호출을하기 전에'WSAGetLastError()'*를 호출해야하고 매번 루프를 돌 때마다'addrSize'를 재 초기화해야합니다. – EJP