==========================================================================================
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
);
버전이 낮으면 성능이 좋지만 호환성 떨어짐
![](https://t1.daumcdn.net/cfile/tistory/23378450565C493A25)
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, 0, sizeof(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, 0, sizeof(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 ); if( 0 >= 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, 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]); 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 ); if( 0 < iLen ) { printf("s -> %s\n", buf); } else { printf("recv Error\n"); } }
closesocket(cSock); WSACleanup(); return 0; } |
-server
![](https://t1.daumcdn.net/cfile/tistory/23371850565C493C26)
![](https://t1.daumcdn.net/cfile/tistory/22582050565C493D0A)
-client
![](https://t1.daumcdn.net/cfile/tistory/23538F50565C493F0E)
![](https://t1.daumcdn.net/cfile/tistory/262EA650565C49402E)