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);
}
안될 때 에러 코드를 알려 주시면 한결 도와드리기
안될 때 에러 코드나 메시지를 알려 주시면 한결 도와드리기 쉬울 것 같습니다.
그리고 같은 질문으로 여러번 올린 글은 삭제해 주세요.
——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -
덧글은 감사드립니다.
하지만 에러코드는 달리 없었습니다.
같은 코드로 다른 자리에서는 되는데 왜 안 되는지 모르겠습니다.
답답하네요.
방화벽도 끄고 제가 아는 범위에서 환경 설정을 보았는데 뭔지 모르겠습니다.
다른자리에서 됬다고 하심 아마도 client
다른자리에서 됬다고 하심 아마도 client 9째줄
char *ip = "210.110.149.150";
이거때문인거 같은데요...
그리고 winsock보다 bsdsock을 먼저공부하는게 맞는거 같아요
(별 차이 없긴 합니다. 소켓관련함수는 거의 똑같고 서버나 클라이언트로
동작하기 위해 리눅스는 syscall 쓰고 윈도우즈는 win32api 쓰는차이정도.)
답변 감사드립니다.
소스 오타 문제는 처리했지만
특정 자리에서 샌드와 리시브가 되지 않습니다.
댓글 달기