TCP 프로 토 콜 기반 프로 세 스 간 통신
5779 단어 네트워크
TCP 프로 토 콜 의 특징:
1) 바이트 로 흐른다.
2) TCP 는 연결 을 위 한 운송 층 프로 토 콜
3) TCP 링크 마다 두 개의 점 만 있 을 수 있다.
4) TCP 는 신뢰성 있 는 서 비 스 를 제공한다.
5) TCP 는 듀 플 렉 스 통신 제공
TCP 프로 토 콜 에 따라 세 번 악 수 를 하면 server 는 감청 상태 에 있 고 client 의 요청 연결 (connect) 신 호 를 받 으 면 accept 이 연결 을 받 습 니 다.
server:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #define _BACKLOG 5
10 void usage(char *_proc)
11 {
12 printf("usage: %s,[ip],[proc]",_proc);
13 }
14 int startup(const char *ip,const int port)
15 {
16 int sock = socket(AF_INET,SOCK_STREAM,0); //
17 if(sock 0)
46 {
47 buf[size] = '\0';
48 }
49 else if(size==0)
50 {
51 printf("client close...
");
52 break;
53 }
54 else
55 {
56 perror("read");
57 exit(3);
58 }
59 printf("client say: %s
",buf);
60 }
61 close(sock);
62 return NULL;
63 }
64
65 int main(int argc,char *argv[])
66 {
67 if(argc != 3)
68 {
69 usage(argv[0]);
70 exit(1);
71 }
72 char *ip = argv[1];
73 int port = atoi(argv[2]);
74 int listen_sock = startup(ip,port);
75 struct sockaddr_in client;
76 socklen_t len = sizeof(client);
77 while(1)
78 {
79 int new_sock = accept(listen_sock,(struct sockaddr*)&client,&len);
80 if(new_sock<0)
81 {
82 perror("accept");
83 continue;
84 }
85 printf("get a client... sock %d,ip: %s,port: %d
",new_sock,inet_nto a(client.sin_addr),ntohs(client.sin_port));
86 #ifdef _V1_ //
87 char buf[1024];
88 while(1)
89 {
90 ssize_t size = read(new_sock,buf,sizeof(buf)-1);
91 if(size>0)
92 {
93 buf[size] = '\0';
94 }
95 else if(size==0)
96 {
97 printf("client close...
");
98 break;
99 }
100 else
101 {
102 perror("read");
103 exit(3);
104 }
105 printf("client say :%s
",buf);
106 }
107 #elif _V2_ //
108 pid_t pid = fork();
109 if(pid<0)
110 {
111 perror("fork");
112 exit(4);
113 }
114 else if(pid == 0)
115 {//child
116 close(listen_sock);
117 char *_client = inet_ntoa(client.sin_addr);
118 char buf[1024];
119 while(1)
120 {
121 memset(buf,'\0',sizeof(buf));
122 ssize_t size = read(new_sock,buf,sizeof(buf)-1);
123 if(size>0)
124 {
125 buf[size] = '\0';
126 }
127 else if(size==0)
128 {
129 printf("[ip]:%s close...
",_client);
130 break;
131 }
132 else
133 {
134 perror("read");
135 exit(3);
136 }
137 printf("[ip]:%s say :%s
",_client,buf);
138 }
139 close(new_sock);
140 exit(0);
141 }
142 else
143 {//father
144 close(new_sock);
145 }
146 #elif _V3_ //
147 pthread_t pid;
148 pthread_create(&pid,NULL,pthread,(void*)new_sock);
149 pthread_detach(pid);
150 #else
151 printf("default");
152 #endif
153 }
154 return 0;
155 }
client:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8
9 void usage(char *proc)
10 {
11 printf("usage:%s,[remote ip],[remote proc]",proc);
12 }
13 int main(int argc,char *argv[])
14 {
15 if(argc != 3)
16 {
17 usage(argv[0]);
18 exit(1);
19 }
20 int sock = socket(AF_INET,SOCK_STREAM,0);
21 if(sock<0)
22 {
23 perror("sock");
24 exit(1);
25 }
26 int port = atoi(argv[2]);
27 char *ip = argv[1];
28 struct sockaddr_in remote;
29 remote.sin_family = AF_INET;
30 remote.sin_port = htons(port);
31 remote.sin_addr.s_addr = inet_addr(ip);
32
33 int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote));
34 if(ret<0)
35 {
36 perror("connect");
37 exit(2);
38 }
39 char buf[1024];
40 while(1)
41 {
42 printf("please say: ");
43 scanf("%s",buf);
44 ssize_t size = write(sock,buf,sizeof(buf)-1);
45
46 }
47 return 0;
48 }
:
[fbl@localhost tcp]$ ./tcp_server 192.168.1.106 8080
get a client... sock 4,ip: 192.168.1.106,port: 51708
client say: hello
client say: hi
client say: nihao
client close...
^C
[fbl@localhost tcp]$
[fbl@localhost tcp]$ ./tcp_client 192.168.1.106 8080
please say: hello
please say: hi
please say: nihao
please say: ^C
[fbl@localhost tcp]$
다음으로 전송:https://blog.51cto.com/fengbaoli/1782252
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
리눅스 입문~컴퓨터 시스템의 하드웨어의 개요와 리눅스의 주요 기능과 그 구조의 개요~별도의 기사에서 각 Linux의 기능인 프로세스 및 메모리 관리 메커니즘에 대한 자세한 내용을 요약합니다. 입력 장치, 네트워크 어댑터를 통해 컴퓨터에서 처리를 수행하도록 요청 프로세스 관리 메모리 관리 장치 조작 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.