728x90
반응형
<WinSock>✔
================================================================
- C++은 C를 재포장
- MFC는 윈32를 통하지 않으면 소켓통신이 안된다.
- 윈도우는 소켓을 사용하려면 반드시 불러야 하는 함수가 있다.
WSADATA wsaData;
if (WSAStartup( MAKEWORD(2, 2), &wsaData) != 0)
{
printf( "error\r\n");
return 0;
}
WSACleanup();
- 유닉스는 이런개념이 없다.
- 버전숫자가 높으면 기능이많고
- 버전 숫자가 낮으면 호환성이 좋다.
- cl로 하면 라이브러리 언급해 줘야한다.
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
* gcc -o server Server.c -lsocket를 같이 적어줘야 하는데. 요즘에는 안써도 소켓사용이 된다.
- 소켓버전에 따라 뭐가 다른지 좋아지는지 - 개인공부
- 중요한것은 시작과 끝에 있어야 한다.
********************************
WSADATA wsaData;
WSACleanup();
* 이 반드시 들어가야 한다.
********************************
winsock의 socket원형
socket
socket는 endpoint socket을 생성한다. BSD:::socket(:12)의 경우 파일 descriptor를 반환한다. winsock(:12) socket 함수는 소켓 기술자 (socket descriptor) SOCKET반환 한다. SOCKET 는 unsigned int 형으로 BSD 소켓의 int형과 약간의 차이가 있다. int를 써도 (경고는 발생할 수 있지만) 큰 문제는 없다. 모든게 파일로 재현되는 유닉스와 달리 윈도는 파일 기술자 와 소켓 기술자가 반드시 일치한다고 볼 수 없으므로 SOCKET을 사용하는게 낫다
SOCKET socket { int af, int type, int protocol };
htons유닉스의 도스용함수
1. 윈속사용 (스타트업) -> 소켓 생성
2. -> 구조체 셋팅
/*server*/
#include <stdio.h>
#include <winsock.h>
#pragma comment (lib , "wsock32.lib" )
#define PORT 7777
#define IP "192.168.0.224"
#define MAX_PACKETLEN 512
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 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); //구조체 셋팅
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 2;
}
memset(&sAddr, 0, sizeof( SOCKADDR_IN ));
iLen = sizeof( SOCKADDR_IN );
cSock = accept(sSock, ( SOCKADDR*)&sAddr, &iLen); //sAddr "재활용"
//상대방 들고오는 아이피 정보
if (cSock == INVALID_SOCKET )
{
printf( "Accept Error\n" );
closesocket(sSock);
WSACleanup();
return 1;
}
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" )) //s/w종료시킬 조건문
{
printf( "Quit\n" );
break;
}
}
closesocket(cSock);
closesocket(sSock);
WSACleanup();
return 0;
}
/*client*/
#include <stdio.h>
#include <winsock.h>
#pragma comment (lib , "wsock32.lib" )
#define PORT 7777
#define IP "192.168.0.224"
#define MAX_PACKETLEN 512
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) != NO_ERROR)
{
return 1;
}
cSock = socket( AF_INET, SOCK_STREAM , 0);
if (cSock == INVALID_SOCKET )
{
return 1;
}
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 (status == SOCKET_ERROR )
{
printf( "Connect Error\n" );
return 3;
}
while (1)
{
memset(cBuf, 0, MAX_PACKETLEN );
printf( ">" );
fgets(cBuf, MAX_PACKETLEN , stdin );
iLen = strlen(cBuf);
//cSock = strcmp(cBuf,"quit");
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;
}
728x90
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151201 - 권오민 - ARM ASSEMBLY 4일차/WinSock 2일차 (2) | 2015.12.01 |
---|---|
20151201 - 홍준모(WinSock) - 1일 차 (2) | 2015.12.01 |
2015-11-30 Win32 API Socket 개인업무일지 - 천정호 (5) | 2015.12.01 |
20151130 김태현 업무일지 Winsock #1 (4) | 2015.12.01 |
20151130 - 강동조 개인업무일지 winsock1일차 (5) | 2015.12.01 |
20151130 임현수 업무일지 Winsock #1 소켓통신 (3) | 2015.12.01 |
20151130_안향진_WINSOCK_1 (5) | 2015.11.30 |
20151130 윤재희 WinAPI #11. winsock을 사용한 서버/클라이언트 프로그램 (5) | 2015.11.30 |