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

20151130 엄민웅 -WinSock 1일차.

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

오전시간 찾아본 PDF파일.

bs16_socket.pdf


오후시간 조인씨 보면서 수업.

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


소켓이 유닉스 기반이라 별 차이 없지만 윈도우에서 짤때 조금 다른 점은

시작할 때 WSAStartup

끝낼 때 WSACleanup

함수 호출 해줘야 한다는 점.

비주얼C에서 짜면 라이브러리 자동설정 되기도 하지만 도스에서 짤때는 

#pragma comment(lib, "Wsock32.lib") 넣어줘야 함.


나머지는 소켓 네트워크 프로그램 짤때 쓰는 함수랑 쓰는게 거의 비슷.


아 그리고 read write 대신에 recv send 함수 사용함.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <winsock.h> 
//#include <winsock2.h> 
#include<stdio.h>
 
#define PORT 7777 
#define IP "192.168.0.30"
#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 iRet;
    int iLen; 
    int Writen;
    char ReadBuffer[MAX_PACKETLEN]; 
 
    if(0 != WSAStartup( MAKEWORD(2, 2), &wsaData ))
    {
        //int WSAStartup( WORD wVersionRequested, WSADATA* lpWSAData)
 
        printf("error\r\n"); 
        return 0;
    }
    
    sSock = socket(AF_INET, SOCK_STREAM, 0); 
    if(sSock == INVALID_SOCKET)
    {
        return 1;
    }
 
    memset( &sAddr, 0, sizeof(SOCKADDR_IN));
    
    sAddr.sin_family = AF_INET; 
    sAddr.sin_port = htons( PORT ); 
    sAddr.sin_addr.S_un.S_addr = inet_addr(IP);
 
    iRet = bind( sSock, (SOCKADDR_IN*)&sAddr, sizeof( SOCKADDR_IN ) ); 
//바인드 시키고난 다음엔 구조체느 필요 없음여
    if( iRet == SOCKET_ERROR)  
    { 
        printf("Bind Error\n"); 
        return 0; 
    } 
    
    if( SOCKET_ERROR == listen( sSock, 5 )) 
    { 
        printf("listen Error\n"); 
        return 0; 
    } 
 
    while(1)
    {
        memset( &sAddr, 0, sizeof(SOCKADDR_IN));
        iLen = sizeof(SOCKADDR_IN);
        cSock = accept( sSock, (SOCKADDR_IN*)&sAddr, &iLen ); 
        if(cSock == INVALID_SOCKET) 
        { 
            printf("Accept Error\n"); 
            closesocket(sSock); 
            WSACleanup(); 
            return 1; 
        } 
 
        printf("incoming Client [%s]:[%d]\n", inet_ntoa(sAddr.sin_addr), ntohs(sAddr.sin_port));
        
        iLen = recv( cSock, ReadBuffer, MAX_PACKETLEN,0 ); 
        
         if( iLen > 0 ) 
        { 
            Writen = send( cSock, ReadBuffer, iLen, 0 ); 
        } 
        else 
        { 
            printf("recv Error\n"); 
        } 
 
        closesocket(cSock);  
        if(0 == strcmp(ReadBuffer, "quit") )
        {
            break;
        }
    }
 
    closesocket( sSock );  
    WSACleanup(); 
    return 0;
}




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <winsock.h> 
//#include <winsock2.h> 
#include<stdio.h>
 
#define PORT 7777 
//#define IP "192.168.0.30"
#define MAXLEN 1024
 
#pragma comment(lib, "Wsock32.lib")
//#pragma comment(lib, "Ws2_32.lib")
 
int main(int argc, char **argv)
{
    WSADATA wsaData; 
    SOCKET cSock;
    SOCKADDR_IN sAddr;
    int iRet;
    int iLen; 
    char cBuf[MAXLEN];
    char cRecvBuf[MAXLEN];
 
    if(argc !=2)
    {
        printf("Usage : %s [ip address]\n", argv[0]);
        return 1;
    }
 
    if(0 != WSAStartup( MAKEWORD(2, 2), &wsaData ))
    {
        //int WSAStartup( WORD wVersionRequested, WSADATA* lpWSAData)
 
        printf("error\r\n"); 
        return 0;
    }
    
    cSock = socket(AF_INET, SOCK_STREAM, 0); 
    if(cSock == INVALID_SOCKET)
    {
        return 1;
    }
 
    memset( &sAddr, 0, sizeof(SOCKADDR_IN));
    
    sAddr.sin_family = AF_INET; 
    sAddr.sin_port = htons( PORT ); 
    sAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
 
    if(connect(cSock, (SOCKADDR_IN*)&sAddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
    {
        printf("connect Error\n");
        return 1;
    }
 
    while(1)
    {
         printf("> ");
         fgets(cBuf, MAXLEN-1, stdin);
         if(strncmp(cBuf, "quit\n",5) == 0)
         {
              break;
         }
 
        send(cSock, (void *)cBuf, strlen(cBuf), 0);
        memset( cRecvBuf, 0, MAXLEN);
        recv(cSock, (void *)cBuf, MAXLEN, 0);
        printf("s -> %s\n", cBuf);
    }
 
    closesocket( cSock );  
    WSACleanup(); 
    return 0;
}


728x90