//TCP기반의 에코서버
//made by chessire
#include<iostream>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void Error(char* szMessage);
void main()
{
SOCKET s; // 서버 소켓 디스크립터
SOCKET cs;
SOCKADDR_IN server; // 소켓 구조체
SOCKADDR_IN client; // 소켓 구조체
WSADATA wsaData; // 스타트업 구조체
int size = sizeof(client);
char value[256]; //수신을 위한 정수값
WSAStartup(MAKEWORD(2,2), &wsaData);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //TCP기반의 서버 생성(IPv4)
if( s == INVALID_SOCKET )
{
Error("socket");
return;
}
server.sin_family = AF_INET; // AF_INET 체계임을 명시
server.sin_port = htons(10000); // 10000번 포트를 사용
server.sin_addr.S_un.S_addr = htonl(ADDR_ANY); // 자동 네트워크 카드 설정
if(bind(s, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
{
closesocket(s);
Error("bind");
return;
}
if( listen(s,SOMAXCONN) != 0 )
{
closesocket(s);
Error("listen");
return;
}
printf("클라이언트로부터 접속을 기다리고 있습니다...\n");
cs = accept(s, (sockaddr*)&client, &size);
//한명의 클라이언트만 접속을 받는다.
if( cs == INVALID_SOCKET)
{
closesocket(s);
Error("accept");
return;
}
printf("클라이언트가 접속되었습니다.\n");
printf("IP = %s, PORT = %d\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port) );
while(1)
{
int num = recv(cs, value, 256,0); //클라이언트에게 메시지를 받는다.
if(num == 0 || num == SOCKET_ERROR) //에러 확인
break;
printf("%s 수신\n",value);
int num2 = send(cs, value, 256,0); //그것을 다시 돌려준다.
}
closesocket(cs);
closesocket(s);
WSACleanup();
}
void Error(char* szMessage)
{
printf("Error:[%d] %s \n", WSAGetLastError(), szMessage);
WSACleanup();
exit(0);
}
//TCP기반의 네트워크
//made by chessire
#include<iostream>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void Error(char* szMessage);
void main()
{
SOCKET s;
WSADATA wsaData;
SOCKADDR_IN server;
char value[256];
::ZeroMemory(value, sizeof(char)*256);
WSAStartup(MAKEWORD(2,2), &wsaData);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
{
Error("socket");
return;
}
server.sin_family = AF_INET;
server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
server.sin_port = htons(10000);
if( connect(s, (sockaddr*)&server, sizeof(server)) != 0 )
{
closesocket(s);
Error("connect");
return;
}
printf("127.0.0.1의 10000번 포트에 접속을 성공.\n");
while(1)
{
char value2[256];
printf("할말 입력(q is quit) : ");
scanf("%s",value);
if(!strcmp(value,"q") || !strcmp(value,"Q"))
break;
send(s, value,256,0);
if(recv(s, value2,256,0) == 0)
break;
printf("%s\n",value);
}
puts("Received file data");
send(s,"Thank you", 10, 0);
closesocket(s);
WSACleanup();
}
void Error(char* szMessage)
{
printf("Error:[%d] %s\n", WSAGetLastError(), szMessage);
WSACleanup();
exit(0);
}
'프로그래밍 > 예전글' 카테고리의 다른 글
OpenAL의 시작 (3) | 2010.12.02 |
---|---|
OSI 7계층과 TCP/IP 4계층 (0) | 2010.08.23 |
리눅스 기본 명령어 (1) | 2010.08.17 |
네트워크의 주소체계와 데이터 정렬 (0) | 2010.08.17 |
소켓의 프로토콜 (socket함수를 파헤쳐보자) (0) | 2010.08.16 |