본문 바로가기

전공 과목 시험정리/C 프로그래밍

윈도우 C 소켓 기본

자료참고: http://dakuo.tistory.com/159




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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
 
#pragma comment(lib,"ws2_32.lib")
 
#define IP "221.151.187.115"
#define PORT 80
#define BUFSIZE 1024
 
int main() {
    WSADATA wsaData;
    SOCKET client;
    SOCKADDR_IN serveraddr;
    char buf[BUFSIZE];
 
    WSAStartup(MAKEWORD(22), &wsaData);
 
    printf("WSAStartup : %d\n", WSAGetLastError());
    client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    printf("socket : %d\n", WSAGetLastError());
 
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(PORT);
    serveraddr.sin_addr.S_un.S_addr = inet_addr(IP);
 
    connect(client, (SOCKADDR*)&serveraddr, sizeof(serveraddr));
 
    strncpy_s(buf, "GET / HTTP/1.1\nHost:www.kim82536.pe.kr\n\n",41);
    send(client, buf, 10240);
 
    memset(buf, 01024);
    recv(client, buf, 10240);
    printf("echo data : \n%s\n", buf);
 
    WSACleanup();
}
cs


[+] windows.h 와 winsock2.h 헤더가 중복되는 부분이 있어서 winsock2.h 를 windows.h 보다 먼저 include 해주어야 함.



WSAStartup() 함수 후,

serveraddr 구조체 초기화 후에 

connect, bind 등의 함수 사용.


필요헤더 : winsock2.h

라이브러리: ws2_32.lib




int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

--> 윈속 관련 라이브러리를 초기화하고, 그 데이터를 WSADATA 에 넣어줌.


wVersionRequested --> 프로그래머가 사용할 윈속의 버전 정보

(MAKEWORD() 등으로 전달. 아니면 WORD 데이터 등으로 전달 함)

참고_클릭

lpWSAData --> WSADATA 형 구조체의 주소값 


MAKEWORD 의 인자값 별 반환값

MAKEWORD(1,2):    return 0x0201    --> 주 버전 1, 부 버전 2

MAKEWORD(1,2):    return 0x0202    --> 주 버전 2, 부 버전 2


int WSACleanup(void);

--> 윈속 관련 라이브러리를 해제할 때 사용


성공 시 0 반환,

실패 시 SOCKET_ERROR 반환