Linux C/C++ TCP Socket通信實例


環境:Linux

語言:C/C++

通信方式:TCP

  下面用TCP協議編寫一個簡單的服務器、客戶端,其中服務器端一直監聽本機的6666號端口。如果收到連接請求,將接收請求並接收客戶端發來的消息;客戶端與服務器端建立連接並發送一條消息。

server.cpp

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<errno.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<unistd.h>
 9 
10 #define MAXLINE 4096
11 
12 int main(int argc, char** argv){
13     int  listenfd, connfd;
14     struct sockaddr_in  servaddr;
15     char  buff[4096];
16     int  n;
17 
18     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
19         printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
20         return 0;
21     }
22 
23     memset(&servaddr, 0, sizeof(servaddr));
24     servaddr.sin_family = AF_INET;
25     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
26     servaddr.sin_port = htons(6666);
27 
28     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
29         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
30         return 0;
31     }
32 
33     if( listen(listenfd, 10) == -1){
34         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
35         return 0;
36     }
37 
38     printf("======waiting for client's request======\n");
39     while(1){
40         if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
41             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
42             continue;
43         }
44         n = recv(connfd, buff, MAXLINE, 0);
45         buff[n] = '\0';
46         printf("recv msg from client: %s\n", buff);
47         close(connfd);
48     }
49     close(listenfd);
50     return 0;
51 }

 client.cpp

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<errno.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<arpa/inet.h>
 9 #include<unistd.h>
10 #define MAXLINE 4096
11 
12 int main(int argc, char** argv){
13     int   sockfd, n;
14     char  recvline[4096], sendline[4096];
15     struct sockaddr_in  servaddr;
16 
17     if( argc != 2){
18         printf("usage: ./client <ipaddress>\n");
19         return 0;
20     }
21 
22     if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
23         printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
24         return 0;
25     }
26 
27     memset(&servaddr, 0, sizeof(servaddr));
28     servaddr.sin_family = AF_INET;
29     servaddr.sin_port = htons(6666);
30     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
31         printf("inet_pton error for %s\n",argv[1]);
32         return 0;
33     }
34 
35     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
36         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
37         return 0;
38     }
39 
40     printf("send msg to server: \n");
41     fgets(sendline, 4096, stdin);
42     if( send(sockfd, sendline, strlen(sendline), 0) < 0){
43         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
44         return 0;
45     }
46     close(sockfd);
47     return 0;
48 }

makefile

 1 all:server client
 2 server:server.o
 3     g++ -g -o server server.o
 4 client:client.o
 5     g++ -g -o client client.o
 6 server.o:server.cpp
 7     g++ -g -c server.cpp
 8 client.o:client.cpp
 9     g++ -g -c client.cpp
10 clean:all
11     rm all

   執行make命令后,生成server和client兩個可執行文件。分別打開兩個終端窗口,一個執行./server命令,一個執行./client 127.0.0.1命令,表示連上本機的6666端口,執行./server命令的要先執行。執行./client 127.0.0.1命令后,會提示說要發給server的內容,輸入“hello”后,client客戶端執行完畢,這時可以看到server的那個終端窗口輸出“recv msg from client: hello”。繼續執行./client 127.0.0.1命令后,再輸入“haha”,server的終端繼續輸出“recv msg from client: haha”。結果如圖所示。

TCP協議通信交互流程:

    

參考文獻:

《后台開發:核心技術與應用實踐》第六章,p206


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM