socket 프로그래밍 질문입니다.
리눅스 소켓 프로그램을 하기 전에 winsock 교재로 공부하고 있습니다. ( 입문 단계입니다. )
server 와 client 가 send() recv () 가 되지 않습니다.
같은 코드로 다른 자리에서는 되는 것을 확인했습니다(!)
왜 그런지 궁금합니다. 환경 설정 문제인디. 참고로 저는 visual c++ 2010 을 사용하고 있습니다
server code 입니다.
#include
#include
#include
void err_display(char *msg) ;
void err_quit(char *msg) ;
int main()
{
SOCKET sock; // 소켓이란 데이타 타입
WSADATA wsa;
SOCKET clnt_sock; // 핸들러 생성
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
int port = 10000 ;
int clntaddr_size;
char msg[] = "client-Hello world!!\n";
int len = 0;
if(WSAStartup(MAKEWORD(2,2),&wsa) != 0 )
return -1;
printf("원속 초기화 성공 \n");
sock = socket ( PF_INET, SOCK_STREAM , 0 );
if( sock == INVALID_SOCKET )
err_quit("socket error");
puts("TCP 소켓 생성 성공");
memset( &serv_addr, 0 , sizeof(serv_addr));
serv_addr.sin_family = PF_INET;
serv_addr.sin_addr.s_addr = htons(INADDR_ANY);
serv_addr.sin_port = htons(port);
if(bind( sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR ) // bind 함수 주소 할당
err_display("BIND ERROR");
puts(" 연결 요청 대기 중 입니다.....");
if ( listen( sock, 10) == SOCKET_ERROR )
err_display("LISTEN ERROR");
clntaddr_size = sizeof(clnt_addr);
clnt_sock = accept( sock, (SOCKADDR*)&clnt_addr,&clntaddr_size );
if (clnt_sock == INVALID_SOCKET )
err_display("ACCEPT ERROR");
else
puts("연결 성공 !!!");
//printf("%s : %d에서 접속 \n",inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port));
memset( msg, '\0', sizeof(msg));
len = recv( clnt_sock, msg, sizeof(msg)-1, 0 );
printf("Message from client : %s(%d) \n",msg,len);
closesocket( sock );
closesocket( clnt_sock);
WSACleanup();
return 0;
}
void err_display(char *msg) // msg만 출력
{
LPVOID lpMsgBuf;
int err = WSAGetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, 0, NULL);
printf("[%s](%d) %s", msg, err, (LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
void err_quit(char *msg) //
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, 0, NULL);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, (LPCWSTR)msg,MB_ICONERROR);
LocalFree(lpMsgBuf);
LocalFree(lpMsgBuf);
exit(-1);
}
client 코드입니다.
#include
#include
#include
void err_quit(char *msg) ;
int main()
{
SOCKET sock;
WSADATA wsaData;
struct sockaddr_in serv_addr;
char *ip = "210.110.149.150";
int port = 10000;
char msg[1024]="server-Hello world";
int len = 0;
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0 )
return -1;
printf("원속 초기화 성공 \n");
sock = socket( PF_INET, SOCK_STREAM, 0);
if( sock == INVALID_SOCKET)
err_quit("SOCKET ERROR");
memset( &serv_addr, 0 , sizeof(serv_addr));
serv_addr.sin_family = PF_INET;
serv_addr.sin_addr.s_addr = inet_addr(ip);
serv_addr.sin_port =htons(port);
if( connect( sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr))== SOCKET_ERROR)
err_quit("CONNECT ERROR");
else
puts(" 서버와 연결 성공");
if(len = send(sock,msg, strlen(msg), 0 ) == -1 )
err_quit("send error");
else
printf("메시지 전송 성공 %s(%d)\n",msg, len);
closesocket( sock );
WSACleanup();
return 0;
}
void err_quit(char *msg) //
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, 0, NULL);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, (LPCWSTR)msg,MB_ICONERROR);
LocalFree(lpMsgBuf);
LocalFree(lpMsgBuf);
exit(-1);
}
댓글 달기