UDP 통신을 시작했습니다. 단순한 스트라이프 다운 버전에서 클라이언트는 기본적으로 이렇게합니다. (예, 많은 if 및 error 검사가 코드에 있으며 No, 많은 정의가 없으면 작동하지 않습니다.) 여기에 실제로 코드보다 conseptual)UDP 및 소켓이 클라이언트에 응답 중입니다.
sock = socket(AF_INET, SOCK_DGRAM, 0);
server_length = sizeof(struct sockaddr_in);
sendto(sock, "Hi", 3, 0, (struct sockaddr *)&myaddr, server_length);
numRes = recvfrom(sock, (char *)buff, (int)sizeof(buff), 0, (struct sockaddr *)&myaddr, &server_length);
그리고 서버는 기본적으로 동일 :
sock=socket(AF_INET, SOCK_DGRAM, 0);
bind(sock,(struct sockaddr *)&server,length);
resBytes=recvfrom(sock,buff,(int)sizeof(buff),0,(struct sockaddr *)&from, &fromlen);
sendto(sock, "Test",5, 0, (struct sockaddr *)&from, fromlen);
이 작동합니다. 양쪽 끝은 상대방이 보내는 데이터를받습니다.
내 문제는 다음과 같습니다. 서버가 많은 요청을 동시에 처리해야합니다. 다른 스레드에서 클라이언트에 다시 보내기 전에 다른 스레드에서 처리 할 수 있도록 메시지 대기열을 만들었습니다. 이 작업을 수행 할 때 보내는 소켓을 새로 만들었으며 메시지 뒤에 나오는 동일한 "보낸 사람"주소를 사용했지만 클라이언트는 메시지를받지 못했습니다.
UDP 메시지에 대한 회신이 동일한 소켓으로 수행되어야한다는 점을 이해해야합니까?
동일한 소켓을 보내고 받는데 3 개의 클라이언트가 메시지를 보내는 경우 어떻게됩니까? 처리 된 후 임의의 순서로 응답합니다. 이게 효과가 있니?
나는 클라이언트에서 "서버"를 만들 수 있지만, 내 생각에 모든 NAT가 그 아이디어를 빠르게 죽일 것입니다.
은 내가 시도하려고하는 것은 더하거나 덜 :
sock=socket(AF_INET, SOCK_DGRAM, 0);
sock2=socket(AF_INET, SOCK_DGRAM, 0);
bind(sock,(struct sockaddr *)&server,length);
resBytes=recvfrom(sock,buff,(int)sizeof(buff),0,(struct sockaddr *)&from, &fromlen);
sendto(sock2, "Test",5, 0, (struct sockaddr *)&from, fromlen);
이런 종류의 코드가 작동해야하는 경우 이러한 경우가처럼, 내 디버깅로 돌아갈 것입니다,하지만 지금은 것입니다.
편집 : 누군가가 "멀티 스레딩"을 태그로 추가했습니다. 멀티 쓰레드를 잊어 버려. 같은 요청에 대해 즉각적으로 응답하지 않는 이유를 설명하면된다. 그게 필요한 경우 하나의 스레드에서 모든 의사 소통을 할 수 있습니다. 미안하지만 사람들을 혼란스럽게하지만, 여기에서 나의 주요 질문은 : a) 클라이언트에서 "서버"를 정의하지 않고 다른 socked로 응답을 보낼 수 있습니까? b) 그렇지 않다면 동일한 socked (IE 클라이언트 A 전송, 클라이언트 B 전송, 클라이언트 B 응답, 클라이언트 A 응답, 클라이언트 A 응답)에서 임의의 응답 순서를 처리하는 방법
소켓은 여러 스레드가 공유 할 수 없습니다. 하지만 UDP는 비 연결형 프로토콜이므로 다른 소켓을 사용하여 보내고받을 수 있습니다. – user0042
@ user0042 : "소켓을 여러 스레드에서 공유 할 수 없습니다. *"물론 가능합니다. 액세스가 동기화되는 방식에 불과합니다. – alk
@alk 음, 동기화는 개별 스레드를 약간 사용하는 목적을 무효로합니다. – user0042