#include <stdio.h>
#include <winsock2.h>
#include <conio.h>
#define BUFSIZE 1024
char m[BUFSIZE];
WSADATA wsaData;
char k;
short mysend;
SOCKET sock = INVALID_SOCKET, sListen;
void server();
void client();
void Error(char* m);
void Error(char* m){
fputs(m, stdout);
fputs("\n", stdout);
system("PAUSE");
exit(-1);
}
int main(){
if (WSAStartup(MAKEWORD(2,2), &wsaData)!=0)
Error("Error! WSA START Error.");
while(1){
system("cls");
printf("Server Or Client? (S or C) -");
fflush(stdin);
k = getch();
switch(k){
case 's':
case 'S':
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server();
mysend = 1;
break;
case 'c':
case 'C':
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
client();
mysend = -1;
break;
}
if(sock!=INVALID_SOCKET) break;
}
while(1){
memset(m, 0, BUFSIZE);
if(mysend==1){
printf("보낼 메세지:");
fflush(stdin);
fgets(m, BUFSIZE-1, stdin);
if(send(sock, m, strlen(m)-1, 0)==SOCKET_ERROR)
Error("보내는 도중 에러\n");
printf("상대방에게 잘 전달됨\n");
}
else if(mysend==-1){
printf("상대방이 메세지를 보내는중\n");
if(recv(sock, m, BUFSIZE-1, 0)==SOCKET_ERROR)
Error("메세지받는 도중 에러\n");
printf("받은 메세지");
fputs(m, stdout);
fputs("\n", stdout);
}
mysend = -mysend;
}
closesocket(sock);
closesocket(sListen);
WSACleanup();
return 0;
}
void server(){
SOCKADDR_IN clntaddr, addr;
int clntsize = sizeof(clntaddr);
unsigned short port;
printf("\n Server Start\n");
printf("Port: ");
fflush(stdin);
scanf("%d", &port);
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&addr, 0, sizeof(addr));
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if (bind(sListen, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)
Error("Bind Error\n");
if (listen(sListen, 5)==SOCKET_ERROR)
Error("LISTEN Error");
printf("서버열기 완료 \n 상대방의 접속을 기다림\n");
sock = accept(sListen, (SOCKADDR*)&clntaddr, &clntsize);
return ;
}
void client(){
SOCKADDR_IN addr;
unsigned short port;
char ip[20];
printf("\nClient Start\n");
printf("IP:");
fflush(stdin);
scanf("%s", ip);
printf("port:");
scanf("%d", &port);
memset(&addr, 0, sizeof(addr));
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if (connect(sock, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)
Error("Connect Error\n");
return;
}
-------------------------------------------------------
서버와 클라이언트간 1대1 채팅프로그램.
실행하자마자 s를 입력하면 서버, c를 입력하면 클라이언트로 동작합니다.
VS6.0의 경우,
project > settings... > Link > Object/binary modules 에
ws2_32.lib를 추가해야합니다.

글
댓글을 달아 주세요
댓글 RSS 주소 : http://lukavega.untoc.com/tc/rss/comment/33댓글 ATOM 주소 : http://lukavega.untoc.com/tc/atom/comment/33