프로그래밍 고수님들께 부탁좀 드리겠습니다..

프로그래밍 고수님들께 부탁좀 드리겠습니다..

| 공개

#pragma comment(lib, "ws2_32")

#include

#include

#include

#define SERVERIP "117.16.93.43"

#define SERVERPORT 9000

#define BUFSIZE 512

// 소켓 함수 오류 출력 후 종료

void err_quit(char *msg)

{

LPVOID lpMsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,

NULL, WSAGetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR)&lpMsgBuf, 0, NULL);

MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);

LocalFree(lpMsgBuf);

exit(1);

}

// 소켓 함수 오류 출력

void err_display(char *msg)

{

LPVOID lpMsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,

NULL, WSAGetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR)&lpMsgBuf, 0, NULL);

printf("[%s] %s", msg, (char *)lpMsgBuf);

LocalFree(lpMsgBuf);

}

// 사용자 정의 데이터 수신 함수

int recvn(SOCKET s, char *buf, int len, int flags)

{

int received;

char *ptr = buf;

int left = len;

while (left > 0) {

received = recv(s, ptr, left, flags);

if (received == SOCKET_ERROR)

return SOCKET_ERROR;

else if (received == 0)

break;

left -= received;

ptr += received;

}

return (len - left);

}

int main(int argc, char *argv[])

{

int retval;

// 윈속 초기화

WSADATA wsa;

if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)

return 1;

// socket()

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock == INVALID_SOCKET) err_quit("socket()");

// connect()

SOCKADDR_IN serveraddr;

ZeroMemory(&serveraddr, sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_addr.s_addr = inet_addr(SERVERIP);

serveraddr.sin_port = htons(SERVERPORT);

retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));

if (retval == SOCKET_ERROR) err_quit("connect()");

// 데이터 통신에 사용할 변수

char buf[BUFSIZE + 1];

int len;

// 서버와 데이터 통신

while (1) {

// 데이터 입력

printf("\n[보낼 데이터] ");

if (fgets(buf, BUFSIZE + 1, stdin) == NULL)

break;

// '\n' 문자 제거

len = strlen(buf);

if (buf[len - 1] == '\n')

buf[len - 1] = '\0';

if (strlen(buf) == 0)

break;

// 데이터 보내기

retval = send(sock, buf, strlen(buf), 0);

if (retval == SOCKET_ERROR) {

err_display("send()");

break;

}

printf("[TCP 클라이언트] %d바이트를 보냈습니다.\n", retval);

// 데이터 받기

retval = recvn(sock, buf, retval, 0);

if (retval == SOCKET_ERROR) {

err_display("recv()");

break;

}

else if (retval == 0)

break;

// 받은 데이터 출력

buf[retval] = '\0';

printf("[TCP 클라이언트] %d바이트를 받았습니다.\n", retval);

printf("[받은 데이터] %s\n", buf);

}

// closesocket()

closesocket(sock);

// 윈속 종료

WSACleanup();

return 0;

}

---------------------------------------------- 클라이언트

#pragma comment(lib, "ws2_32")

#include

#include

#include

#define SERVERPORT 9000

#define BUFSIZE 512

// 소켓 함수 오류 출력 후 종료

void err_quit(char *msg)

{

LPVOID lpMsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,

NULL, WSAGetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR)&lpMsgBuf, 0, NULL);

MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);

LocalFree(lpMsgBuf);

exit(1);

}

// 소켓 함수 오류 출력

void err_display(char *msg)

{

LPVOID lpMsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,

NULL, WSAGetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR)&lpMsgBuf, 0, NULL);

printf("[%s] %s", msg, (char *)lpMsgBuf);

LocalFree(lpMsgBuf);

}

int main(int argc, char *argv[])

{

int retval;

// 윈속 초기화

WSADATA wsa;

if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)

return 1;

// socket()

SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);

if (listen_sock == INVALID_SOCKET) err_quit("socket()");

// bind()

SOCKADDR_IN serveraddr;

ZeroMemory(&serveraddr, sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

serveraddr.sin_port = htons(SERVERPORT);

retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));

if (retval == SOCKET_ERROR) err_quit("bind()");

// listen()

retval = listen(listen_sock, SOMAXCONN);

if (retval == SOCKET_ERROR) err_quit("listen()");

// 데이터 통신에 사용할 변수

SOCKET client_sock;

SOCKADDR_IN clientaddr;

int addrlen;

char buf[BUFSIZE + 1];

while (1) {

// accept()

addrlen = sizeof(clientaddr);

client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);

if (client_sock == INVALID_SOCKET) {

err_display("accept()");

break;

}

// 접속한 클라이언트 정보 출력

printf("\n[TCP 서버] 클라이언트 접속: IP 주소=%s, 포트 번호=%d\n",

inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

// 클라이언트와 데이터 통신

while (1) {

// 데이터 받기

retval = recv(client_sock, buf, BUFSIZE, 0);

if (retval == SOCKET_ERROR) {

err_display("recv()");

break;

}

else if (retval == 0)

break;

// 받은 데이터 출력

buf[retval] = '\0';

printf("[TCP/%s:%d] %s\n", inet_ntoa(clientaddr.sin_addr),

ntohs(clientaddr.sin_port), buf);

// 데이터 보내기

retval = send(client_sock, buf, retval, 0);

if (retval == SOCKET_ERROR) {

err_display("send()");

break;

}

}

// closesocket()

closesocket(client_sock);

printf("[TCP 서버] 클라이언트 종료: IP 주소=%s, 포트 번호=%d\n",

inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

}

// closesocket()

closesocket(listen_sock);

// 윈속 종료

WSACleanup();

return 0;

}

------------------------------------------ 서버

위 클라이언트, 서버를 멀티쓰레드 함수를 추가해서 지금 송신또는 수신만 되는걸 송수신이 가능하게 바꿔야하는데

전혀 모르겠어요... 좀도와주세요 ㅠㅠ

기프티콘으로 성의 표시할게요ㅠ

댓글

댓글 본문
graphittie 자세히 보기