티스토리 뷰
Source : http://blog.naver.com/muwoo850502/50032210336
1: #include<stdio.h>
2: #include<string.h>
3: #include<sys/types.h>
4: #include<sys/socket.h>
5: #include<netinet/in.h>
6: #include<arpa/inet.h>
7: #include<unistd.h>
8: #include<errno.h>
9:
10: #define PORT 7777
11: #define MAXPENDING 5
12: #define BUFSIZE 1024
13:
14: main()
15: {
16: int servSockfd;
17: int clntSockfd;
18: struct sockaddr_in servSockfd;
19: struct sockaddr_in clntSockfd;
20: char recvBuffer[BUFSIZE];
21: char sendBuffer[BUFSIZE];
22: int clntLen;
23: int recvLen;
24:
25: /*소켓 생성*/
26: if((servSockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
27: {
28: perror("sock failed");
29: exit(1);
30: }
31: /*servaddr를 0으로 초기화*/
32: memset(&servAddr,0,sizeof(servAddr));
33: /*servaddr에 주소 정보 저장*/
34: servAddr.sin_family=AF_INET;
35: servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
36: servAddr.sin_port-htons(PORT);
37:
38: /*servsockfd 소켓에 주소정보 연결*/
39: if(bind(servSockfd,(struct sockaddr*)&servAddr,sizeof(servAddr))==-1)
40: {
41: perror("bind failed");
42: exit(1);
43: }
44:
45: /*servsockfd 소켓에 들어오는 클라이언트 요청 기다림*/
46: if(listen(servSockfd,MAXPENDING)==-1)
47: {
48: perror("listen failed");
49: exit(1);
50: }
51:
52: /*무한반복*/
53: while(1)
54: {
55: clntLen=sizeof(clntAddr);
56: /*servSockfd 소켓으로 들어오는 클라리언트 요청 받아들임*/
57: if((clntSockfd=accept(servSockfd,(struct sockaddr*)&clntAddr,&clntLen))==-1)
58: {
59: perror("accept failed");
60: exit(1);
61: }
62: printf("client is in\n");
63: /*자식프로세스 생성*/
64: switch(fork())
65: {
66: case -1:
67: perror("fork failed");
68: exit(1);
69:
70: /*자식프로세스는*/
71: case 0:
72: close(servSockfd);
73: /*임의의 클라이언트에 대해 반복*/
74: while(1)
75: {
76: /*clntSockfd 소켓으로 들어오는 데이터를 받아 recvBuffer에 저장*/
77: if((revcLen=recv(clntSockfd,recvBuffer,BUFSIZE,0))==-1)
78: {
79: perror("recv failed");
80: exit(1);
81: }
82: /*클라이언트가 연결을 끊으면 recv는 0을 반환*/
83: if(recvLen==0)
84: break;
85:
86: recvBuffer[recvLen]='?';
87: /*받은 데이터를 출력*/
88: printf("%s\n",recvBuffer);
89: }
90: close(clntSockfd);
91: exit(0);
92:
93: /*부모 프로세스는*/
94: default:
95: while(1)
96: {
97: /*터미널로부터 데이터 입력*/
98: fgets(sendBuffer,BUFSIZE,stdin);
99:
100: /*입력받은 데이터를 클라이언트에게 보냄*/
101: if(send(clntSockfd,sendBuffer,strlen(senBuffer),MSG_NOSIGNAL)!=strlen(sendBuffer))
102: {
103: /*상대방의 연결이 끊겨 호출에 실패하면 erroe에는 EPIPE가 저장*/
104: if(errno==EPIPE)
105: {
106: printf("client is out\n");
107: break;
108: }
109: perror("send failed");
110: exit(1);
111: }
112: }
113: }
114: close(clntSockfd);
115: }
116: }
'Application > C/C++' 카테고리의 다른 글
포인터는 왜 어려울까? (0) | 2011.03.21 |
---|---|
리눅스 채팅 클라이언트 (0) | 2010.12.01 |
주변광 센서를 이용한 보다 스마트한 기기 구현하기 (0) | 2010.11.02 |
D3DFORMAT (0) | 2010.11.02 |
[CPP] 디버깅에 관하여 (0) | 2010.08.24 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- BadCode
- 3D Engine
- win32
- diary
- C#
- 짤방 및 아이콘
- Embedded System
- Tech News
- console
- Network Inspector
- 야마꼬툰
- Mabinogi
- Information Processor
- Linux
- Battle
- network
- 나비효과
- USB Lecture
- cartoon
- humor
- Reverse Engineering
- medical
- 프리랜서로 살아남는 법
- 막장로그
- wallpaper
- Web Programming
- Assembly
- Military
- Life News
- WDB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함