socket 프로그래밍 질문입니다.

new0092의 이미지

리눅스 소켓 프로그램을 하기 전에 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);

}


empty2fill의 이미지

안될 때 에러 코드나 메시지를 알려 주시면 한결 도와드리기 쉬울 것 같습니다.

그리고 같은 질문으로 여러번 올린 글은 삭제해 주세요.

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

익명 사용자의 이미지

하지만 에러코드는 달리 없었습니다.

같은 코드로 다른 자리에서는 되는데 왜 안 되는지 모르겠습니다.

답답하네요.

방화벽도 끄고 제가 아는 범위에서 환경 설정을 보았는데 뭔지 모르겠습니다.

vivisection의 이미지

다른자리에서 됬다고 하심 아마도 client 9째줄
char *ip = "210.110.149.150";
이거때문인거 같은데요...

그리고 winsock보다 bsdsock을 먼저공부하는게 맞는거 같아요
(별 차이 없긴 합니다. 소켓관련함수는 거의 똑같고 서버나 클라이언트로
동작하기 위해 리눅스는 syscall 쓰고 윈도우즈는 win32api 쓰는차이정도.)

익명 사용자의 이미지

소스 오타 문제는 처리했지만

특정 자리에서 샌드와 리시브가 되지 않습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.