본문 바로가기

Engineering/Network

채팅 클라이언트(윈도우용)

728x90

 인터넷에 구한 채팅 클라이언트 소스를 수정해보았다. 너무 간단하게 작성한 것이라, 기능 추가하려면 이것저것 고쳐야 할것이 많지만 간단한 채팅 기능을 확인할 수 있다.
 vc 를 컴파일시에는 Winsock2 를 사용하므로, ws2_32.lib 를 링크시켜야한다.


#include <WinSock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define  LINE 1024

DWORD WINAPI ProcessInputSend(LPVOID arg);

char userID[10]; // 유저ID
char line[LINE], chatdata[LINE+1];
struct sockaddr_in server_addr;
SOCKET serversocket; // 서버 연결 소켓
char *escape = "/quit"; // 종료 명령
BOOL bIsQuit; // 종료 flag

void main()
{
WSADATA wsa; // 소켓
HANDLE hThread; // 스레드
DWORD ThreadId;
int size;

bIsQuit = FALSE;
printf("Input ID : "); // 유저ID 입력
gets(userID);

// 소켓 초기화
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) {
exit(1);
}
// 소켓 생성
if ((serversocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("fail make socket\n");
exit(0);
}
// 메모리 초기화
ZeroMemory(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET; // 소켓 인자들 설정
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// server_addr.sin_addr.s_addr = inet_addr("192.168.100.211");
server_addr.sin_port = htons(8787);

// 서버와 연결
if (connect(serversocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
printf("fail connect 2 server\n");
exit(0);
}
else {
printf("connected server\n");
}
// 스레드 생성
hThread = CreateThread(NULL, 0, ProcessInputSend, 0, 0, &ThreadId);
if (hThread == NULL) {
printf("fail make thread\n");
}
else {
CloseHandle(hThread);
}

while (!bIsQuit) {
ZeroMemory(chatdata, sizeof(chatdata));

if ((size = recv(serversocket, chatdata, LINE, 0)) == INVALID_SOCKET) {
printf("recv ERROR\n");
exit(0);
}
else {
chatdata[size] = '\0';
printf("%s\n", chatdata);
}
}

closesocket(serversocket);
WSACleanup();
}

/* 사용자 입력 */
DWORD WINAPI ProcessInputSend(LPVOID arg)
{
while(TRUE) {
if (fgets(chatdata, LINE, stdin)) { // 스트림 read
chatdata[strlen(chatdata) - 1] = '\0';
sprintf(line, "\n[%s] : %s", userID, chatdata); // 버퍼의 첫 내용을 출력
if (send(serversocket, line, strlen(line), 0) < 0) {
printf("Write fail\n");
}

if (strstr(line, escape) != 0) { // 종료명령어
printf("Bye\n");
closesocket(serversocket);
bIsQuit = TRUE;
exit(0);
}
}
}
return 0;
}




'Engineering > Network' 카테고리의 다른 글

snort inline 정리.... 시작  (0) 2010.08.25
unix socket 을 이용하는 예제  (0) 2010.06.24
linux 에서 fd_set MAX 변경  (0) 2010.06.14
채팅 서버 - epoll 버전  (0) 2010.06.14
채팅 서버(윈도우용) - select 버전  (0) 2010.06.14