■ Winsock
■ 소켓통신
윈속도 리눅스와 마찬가지로 유닉스의 소켓통신의 영항을 많이 받았다.
MFC도 win32의 윈속를 통하지 않고서는 소켓통신이 안된다.
MAKEWORD(1, 2); 주 버전1, 부 버전 2, 0x0201반환
MAKEWORD(2, 2); 주 버전2, 부 버전 2, 0x0202반환
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
도 사용가능(최신버전)
gcc컴파일에서도 예전에는
gcc -o server server.c -lsocket
라고 표기를 해줫었다. 요즘에는 안해도 됨.
#include <stdio.h> #include <winsock.h>
#pragma comment(lib, "wsock32.lib") // 수동으로 추가해야된다.
#define MAX_PACKETLEN 512
#define PORT 7777 #define IP "192.168.0.227"
int main(void) { WSADATA wsaData; SOCKET sSock; SOCKET cSock; SOCKADDR_IN sAddr; int status; int iLen; int iWriten; char cBuf[MAX_PACKETLEN];
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) // 윈속을 사용하겠다. { printf("error\r\n"); return 1; }
sSock = socket(AF_INET, SOCK_STREAM, 0); // 소켓 생성 if(INVALID_SOCKET == sSock) { printf("유효하지않은 소켓입니다.\r\n"); return 2; }
printf("Success socket create\r\n"); 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);
status = bind( sSock, (SOCKADDR *)&sAddr, sizeof(SOCKADDR_IN)); if( status == SOCKET_ERROR) { printf("Bind Error\n"); return 3; }
if( SOCKET_ERROR == listen(sSock, 5)) { printf("listen Error\n"); return 4; }
memset(&sAddr, 0, sizeof(SOCKADDR_IN)); iLen = sizeof(SOCKADDR_IN);
cSock = accept(sSock, (SOCKADDR *)&sAddr, &iLen); if(cSock == INVALID_SOCKET) { printf("Accept Error\n"); closesocket(sSock); WSACleanup(); return 5; }
printf("Incomming Client : [%s] : [%d]\n", inet_ntoa(sAddr.sin_addr), ntohs(sAddr.sin_port));
while(1) { iLen = recv( cSock, cBuf, MAX_PACKETLEN,0 ); if( iLen > 0 ) { iWriten = send( cSock, cBuf, iLen, 0 ); printf("[Client]:[%s]\n", cBuf); } else { printf("read Error\n"); } if(0 == strcmp(cBuf, "quit") ) { printf("[Client]:[Disconnected..]\n"); break; } } closesocket(cSock); closesocket(sSock); WSACleanup();
return 0; } |
#include <stdio.h> #include <winsock.h>
#pragma comment(lib, "wsock32.lib") // 수동으로 추가해야된다.
#define MAX_PACKETLEN 512
#define PORT 7777 #define IP "192.168.0.227"
int main(void) { WSADATA wsaData; SOCKET sSock; SOCKET cSock; SOCKADDR_IN cAddr; int status; int iLen; char cBuf[MAX_PACKETLEN];
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) // 윈속을 사용하겠다. { printf("error\r\n"); return 1; }
cSock = socket(AF_INET, SOCK_STREAM, 0); // 소켓 생성 if(INVALID_SOCKET == cSock) { printf("유효하지않은 소켓입니다.\r\n"); return 2; }
memset(&cAddr, 0, sizeof(SOCKADDR_IN)); // 구조체 초기화
cAddr.sin_family = AF_INET; // 구조체 셋팅 cAddr.sin_port = htons( PORT ); cAddr.sin_addr.S_un.S_addr = inet_addr(IP);
status = connect(cSock, (SOCKADDR *)&cAddr, sizeof(SOCKADDR_IN)); if( SOCKET_ERROR == status) { printf("connect Error\n"); return 4; }
while(1) { memset(cBuf, 0, MAX_PACKETLEN); printf("> "); fgets(cBuf, MAX_PACKETLEN, stdin); iLen = strlen(cBuf); cBuf[iLen-1] = 0;
if(0 == strcmp(cBuf, "quit")) { send(cSock, cBuf, strlen(cBuf), 0); printf("[Client]:[Disconnected..]\n"); break; }
send(cSock, cBuf, strlen(cBuf), 0);
memset(cBuf, 0, MAX_PACKETLEN); recv(cSock, cBuf, MAX_PACKETLEN, 0); printf("[Server]:[%s]\n", cBuf); } closesocket(cSock); WSACleanup();
return 0; } |
▲ 서버측 미완성