리눅스 기반의 초간단 에코서버
gcc 로 대충 어울렁더울렁 컴파일해서 ./a.out 으로 열심히 하면 됨.
file: main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 5471
#define MAX_BUF 1024
int main()
{
int ssock, csock;
int clen;
struct sockaddr_in server_addr, client_addr;
char szSendBuff[MAX_BUF];
char szRecvBuff[MAX_BUF];
char szSendBuff[MAX_BUF];
char szRecvBuff[MAX_BUF];
// 서버 소켓 생성
if ((ssock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
{
perror("socket error: ");
exit(1);
}
clen=sizeof(client_addr);
// 서버 구조체 초기화
memset(&server_addr, 0x00, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
memset(&server_addr, 0x00, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
// bind
if (bind(ssock, (struct sockaddr *)&server_addr, sizeof(server_addr))<0)
{
perror("bind error : ");
exit(1);
}
if (bind(ssock, (struct sockaddr *)&server_addr, sizeof(server_addr))<0)
{
perror("bind error : ");
exit(1);
}
// listen
if (listen(ssock, 8) < 0)
{
perror("listen error : ");
exit(1);
}
// Accept 루프
while (1)
{
// Send, Recv 버퍼 초기화
memset(szSendBuff, 0x00, sizeof(szSendBuff));
memset(szRecvBuff, 0x00, sizeof(szRecvBuff));
while (1)
{
// Send, Recv 버퍼 초기화
memset(szSendBuff, 0x00, sizeof(szSendBuff));
memset(szRecvBuff, 0x00, sizeof(szRecvBuff));
// accept
csock = accept(ssock, (struct sockaddr *)&client_addr, &clen);
csock = accept(ssock, (struct sockaddr *)&client_addr, &clen);
// Recv
if (recv(csock, szRecvBuff, MAX_BUF, 0) <= 0)
{
perror("read error : ");
exit(1);
}
if (recv(csock, szRecvBuff, MAX_BUF, 0) <= 0)
{
perror("read error : ");
exit(1);
}
// Recv 된 버퍼가 1 이면 1 을 보내고 아니라면 2를 보냄
// 보내기 버퍼 세팅
if (strcmp(szRecvBuff, "1")==0)
{
strcpy(szSendBuff, "1");
}
else
{
strcpy(szSendBuff, "2");
}
// 보내기 버퍼 세팅
if (strcmp(szRecvBuff, "1")==0)
{
strcpy(szSendBuff, "1");
}
else
{
strcpy(szSendBuff, "2");
}
// Send
if (send(csock, szSendBuff, MAX_BUF, 0) <= 0)
{
perror("write error : ");
exit(1);
}
if (send(csock, szSendBuff, MAX_BUF, 0) <= 0)
{
perror("write error : ");
exit(1);
}
close(csock);
} // while (1)
} // while (1)
close(ssock);
return 0;
}
return 0;
}
'C, C++' 카테고리의 다른 글
[Linux] 파일 시스템 감시 (inofity) (2) | 2009.11.24 |
---|---|
[C/C++] Unix에서 C 언어로 email 보내는 방법 (0) | 2009.04.19 |
[C/C++] 스트링 종류들... (0) | 2009.04.18 |
[C/C++] strlen 사용시 warning 뜨는 거 해결 (signed/unsigned mismatch) (0) | 2009.04.18 |