简单的TCP通信
开发环境
1.VisualStudio2019
2.c语言
3.win10
话不多说,代码开始
sever:
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 1500
// 소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
printf("Error [%s] ... program terminated \n",msg);
exit(-1);
}
// 소켓 함수 오류 출력
void err_display(char *msg)
{
printf("socket function error [%s]\n", msg);
}
int main(int argc, char* argv[])
{
// 데이터 통신에 사용할 변수
SOCKET listen_sock;
SOCKET client_sock;
SOCKADDR_IN serveraddr;
SOCKADDR_IN clientaddr;
int addrlen;
char buf[BUFSIZE+1];
int retval, msglen;
// 윈속 초기화
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
return -1;
// socket()
listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if(listen_sock == INVALID_SOCKET) err_quit("socket()");
// server address
ZeroMemory(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(9000);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind()
retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
if(retval == SOCKET_ERROR) err_quit("bind()");
// listen()
// retval = listen(listen_sock, SOMAXCONN);
retval = listen(listen_sock, 2);
if(retval == SOCKET_ERROR) err_quit("listen()");
while (1) {
// accept()
addrlen = sizeof(clientaddr);
client_sock = accept(listen_sock, (SOCKADDR*)& clientaddr, &addrlen);
if (client_sock == INVALID_SOCKET) {
err_display("accept()");
continue;
}
printf("\n[TCP Server] Client accepted : IP addr=%s, port=%d\n",
inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
// 클라이언트와 데이터 통신
while (1) {
// 데이터 받기
msglen = recv(client_sock, buf, BUFSIZE, 0);
if (msglen == SOCKET_ERROR) {
err_display("recv()");
break;
}
else if (msglen == 0)
break;
// 받은 데이터 출력
buf[msglen] = '\0';
printf("[TCP/%s:%d] %s\n", inet_ntoa(clientaddr.sin_addr),
ntohs(clientaddr.sin_port), buf);
// 데이터 보내기
retval = send(client_sock, buf, msglen, 0);
if (retval == SOCKET_ERROR) {
err_display("send()");
break;
}
//输入QUIT将关闭客户端socket
if (strcmp(buf, "QUIT") == 0)
{
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;
}
client:
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 1500
// socket errof display and quit
void err_quit(char* msg)
{
printf("socket function error [%s] (error code: %d)... program terminated \n", msg, WSAGetLastError());
exit(-1);
}
// socket errof display and quit
void err_display(char* msg, int code)
{
printf("%s (error code: %d)\n", msg, code);
}
int main(int argc, char* argv[])
{
int retval;
SOCKET sock;
SOCKADDR_IN serveraddr;
char buf[BUFSIZE+1];
int len;
// 윈속 초기화
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
return -1;
printf("# TCP echo CLIENT\n");
printf("# Network SW Design Course by Ajou University \n\n");
// socket()
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET) err_quit("socket()");
// server address
ZeroMemory(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(9000);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// connect()
retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
if(retval == SOCKET_ERROR) err_quit("connect()");
// communication with the server
while(1){
// input data to be sent to the server
ZeroMemory(buf, sizeof(buf));
printf("\n[Input Data] ");
if(fgets(buf, BUFSIZE+1, stdin) == NULL)
continue;
// make input string message
len = strlen(buf);
if(buf[len-1] == '\n')
buf[len-1] = '\0';
if(strlen(buf) == 0)
continue;
// send message
retval = send(sock, buf, strlen(buf), 0);
if(retval == SOCKET_ERROR){
err_display("socket error: send()", WSAGetLastError());
break;
}
printf("[TCP Clinet: send] message %d bytes sent ... \n\n", retval);
// receive echo message from the server
retval = recv(sock, buf, BUFSIZE, 0);
if(retval == SOCKET_ERROR){
err_display("socket error: recv()", WSAGetLastError());
break;
}
else if(retval == 0)
break;
// display the echoed data
buf[retval] = '\0';
printf("[TCP Client: recv] message %d bytes received.\n", retval);
printf("[Received message] %s\n\n", buf);
}
// closesocket()
closesocket(sock);
// 윈속 종료
WSACleanup();
return 0;
}