|
DWORD WINAPI ProcessClient(LPVOID arg)
{
SOCKET client_sock = (SOCKET)arg;
SOCKADDR_IN clientaddr;
char buf[BUFSIZE+1];
int addrlen;
int retval;
// 클라이언트 정보 얻기
addrlen = sizeof(udpaddr);
getpeername(client_sock, (SOCKADDR *)&clientaddr, &addrlen);
while(1){
//retval = recvn(client_sock, buf, BUFSIZE, 0);
addrlen = sizeof(clientaddr);
retval = recvfrom(client_sock, buf, BUFSIZE, 0, (SOCKADDR *)&clientaddr, &addrlen);
if(retval == SOCKET_ERROR){
err_display("recvn(zzzzzzzzzzz)");
continue;
}
// 받은 데이터 출력
buf[retval] = '\0';
printf("[TCP/%s:%d] %s\n",
inet_ntoa(clientaddr.sin_addr),
ntohs(clientaddr.sin_port), buf);
/*
// 데이터 보내기
retval = send(client_sock, buf, strlen(buf), 0);
if(retval == SOCKET_ERROR) {
err_display("sendto()");
break;
}
*/
}
// closesocket()
closesocket(client_sock);
printf("[UDP 서버] 클라이언트 종료: IP 주소=%s, 포트 번호=%d\n",
inet_ntoa(clientaddr.sin_addr),
ntohs(clientaddr.sin_port));
return 0;
}
///////////////////////////////////////////////////
메인에서 스레드 시작
DWORD ThreadId;
HANDLE hThread = CreateThread(NULL, 0, ProcessClient, (LPVOID)sock, 0, &ThreadId);
멀티 스레드 소스입니다. 책을 보면서 다 vs 다 채팅을 구현하려고 하는데요.
책의 멀티 스레드 내용은 tcp의 멀티 스레드 뿐이네요 ㅠㅠㅠ
서버는 여러 클라이언트로 부터 입력받은 내용을 모두 (브로드캐스트or멀티캐스트)로 sendto한 후
클라이언트는 채팅을 입력받아 보내는(sendto) 코드, 서버로부터 전송받은 것(recvfrom)을 뿌려주는 스레드
클라이언트 부분에 스레드를 만들려고 합니다.... 헌데 CreateThread 할 때 매개변수로
tcp소켓밖에 가져가지 못하네요 ㅜㅜ tcp소켓에는 소켓 어드레스 구조체가 포함되어 있는듯 한데,
udp소켓에는 보낼 때 소켓 어드레스 주소와 크기를 모두 보내야 하는데
매개변수를 추가로 줘서 메인에서 스레드 시작하는 법을 알고 싶습니다ㅠㅠ ( 매개변수 2개인 스레드 호출법)
1. Create스레드 매개변수로 소켓 이외에 소켓 어드레스 구조체도 매개변수로 받는 방법을 알고 싶습니다.
즉, udp소켓으로 멀티 스레딩 구현법을 제발 좀 알려주세욥 !~!!!!!!!!!!!!!ㅜㅜㅜ
2.getpeername(client_sock, (SOCKADDR *)&clientaddr, &addrlen);
매개변수 소켓부분에 udp소켓으로 처리하면 clientaddr, addlent부분을 못받아오는 것 인지도 알고싶습니다 ㅜㅠㅜ
|