본문 바로가기
코스웨어/15년 스마트컨트롤러

20151130_안향진_WINSOCK_1

by 알 수 없는 사용자 2015. 11. 30.
728x90
반응형

==========================================================================================

WINSOCK

==========================================================================================


<WINSOCK>


http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/win_network_prog/doc/winsock_basic


signed int 형의 파일 지정 번호를 이용해서 파일을 제어


BSD 소켓과의 호환을 유지하기 위해서 unsigned int 를 재 정의한 (소켓 지정 번호)SOCK으로 소켓을 다룬다. 소켓을 지시하기 때문에 소켓 지시자라고 부른다. 기본적으로 윈도는 파일과 소켓을 다른 객체로 본다. 


*MFC도 내부에 WIN32함수를 포함하고 있음



WSAStartup(MAKEWORD(2,2),&wsaData)


int WSAStartup (
            WORD   
wVersionRequested,
            LPWSADATA   lpWSAData
);

버전이 낮으면 성능이 좋지만 호환성 떨어짐



 WSACleanup();




SOCKET socket{    int af,    int type,    int protocol};



*gcc -o server server.c -lsocket => 원래는 해줘야 함




<server.c>

#include <winsock.h> 
#include
 <stdio.h>

#define
 PORT 7777
#define
 IP "192.168.0.169"
#define
 MAX_PACKETLEN 512 

#pragma
 comment(lib, "wsock32.lib")
//#pragma comment(lib, "ws2_32.lib") // 최신


int
 main()
{
  WSADATA wsaData;
  SOCKET sSock;
  SOCKET cSock;
  SOCKADDR_IN sAddr;
  
int iStatus;
  
int iLen;
  
char ReadBuffer[MAX_PACKETLEN]; 
  
  
if(WSAStartup(MAKEWORD(2,2),&wsaData)!= 0)
  {
    printf(
"WSAStartup error\n");
    
return 0;
  }

  sSock 
= socket(AF_INET, SOCK_STREAM, 0);
  
if(INVALID_SOCKET == sSock)
  {
    printf(
"Invalid socket error\n");
    WSACleanup(); 
    
return 1;
  }

  memset(
&sAddr, 0sizeof(SOCKADDR_IN));
  sAddr.sin_family 
= AF_INET;
  sAddr.sin_port 
= htons(PORT);
  sAddr.sin_addr.S_un.S_addr 
= inet_addr(IP);
    
  iStatus 
= bind( sSock, (SOCKADDR*)&sAddr, sizeof(SOCKADDR_IN) ); 
  
if(SOCKET_ERROR == iStatus)
  {    
    printf(
"bind error\n");
    closesocket(sSock);
    WSACleanup(); 
    
return 2;
  }

  
if( SOCKET_ERROR == listen( sSock, 5 )) 
  {     
    printf(
"listen Error\n"); 
    closesocket(sSock);
    WSACleanup(); 
    
return 3
  }

  
while(1)
  {
    memset(
&sAddr, 0sizeof(SOCKADDR_IN));
    iLen 
= sizeof(SOCKADDR_IN);
    cSock 
= accept( sSock, (SOCKADDR*)&sAddr, &iLen ); 
    
if(INVALID_SOCKET == sSock)
    { 
      printf(
"accept Error\n"); 
      closesocket(sSock);
      WSACleanup(); 
      
return 4
    }
    printf(
"Incoming client[%s]:[%d]\n", inet_ntoa(sAddr.sin_addr), ntohs(sAddr.sin_port));

    iLen 
= recv( cSock, ReadBuffer, MAX_PACKETLEN,0 ); 
    
if0 >= iLen )
    {
      printf(
"recv Error\n"); 
    }      

    
//printf("c1 -> %s\n", ReadBuffer);
    iLen 
=  send( cSock, "recv ok", MAX_PACKETLEN, 0 ); 
    
if( SOCKET_ERROR == iLen)
    {
      printf(
"send Error\n"); 
    }
    
    closesocket(cSock);
    
//printf("c2 -> %s\n", ReadBuffer);
    
if(0 == strncmp(ReadBuffer, "quit\n",5))
    {
      
break;
    }
  }

  closesocket(sSock);
  WSACleanup();
  
  
return 0;
}

<client.c>

#include <winsock.h> 
#include
 <stdio.h>

#define
 PORT 7777
#define
 IP "192.168.0.169"
#define
 MAX_PACKETLEN 512 
#define
 MAXLEN 1024

#pragma
 comment(lib, "wsock32.lib")
//#pragma comment(lib, "ws2_32.lib") // 최신


int
 main(int argc, char **argv)
{
  WSADATA wsaData;
  SOCKET cSock;
  
int iStatus;
  
int iLen;
  SOCKADDR_IN sAddr;
  
char buf[MAXLEN];
  
char rbuf[MAXLEN];

  
if(argc !=2)
  {
    printf(
"Usage : %s [ip address]\n", argv[0]);
    
return 1;
  }
  
  
if(WSAStartup(MAKEWORD(2,2),&wsaData)!= 0)
  {
    printf(
"WSAStartup error\n");
    
return 0;
  }

  cSock 
= socket(AF_INET, SOCK_STREAM, 0);
  
if(INVALID_SOCKET == cSock)
  {
    printf(
"Invalid socket error\n");
    WSACleanup(); 
    
return 1;
  }

  memset(
&sAddr, 0sizeof(SOCKADDR_IN));
  sAddr.sin_family 
= AF_INET;
  sAddr.sin_port 
= htons(PORT);
  sAddr.sin_addr.S_un.S_addr 
= inet_addr(argv[1]);
    
  iStatus 
= connect( cSock, (SOCKADDR*)&sAddr, sizeof(SOCKADDR_IN) ); 
  
if(SOCKET_ERROR == iStatus)
  {    
    printf(
"connect error\n");
    closesocket(cSock);
    WSACleanup(); 
    
return 2;
  }

  
while(1)
  {
    printf(
"> ");
    fgets(buf, MAXLEN-
1, stdin);

    iLen 
=  send( cSock, buf, MAX_PACKETLEN, 0 ); 
    
if( SOCKET_ERROR == iLen)
    {
      printf(
"send Error\n"); 
    }
    
//memset(rbuf, 0x00, MAXLEN);
    
if(strncmp(buf, "quit\n",5== 0)
    {
      
break;
    }
    iLen 
= recv( cSock, buf, MAX_PACKETLEN,0 ); 
    
if0 < iLen )
    {
      printf(
"s -> %s\n", buf);
    }
    
else
    {
      printf(
"recv Error\n"); 
    }
    
  }

  closesocket(cSock);
  WSACleanup();
  
  
return 0;
}


-server





-client





728x90