歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

簡單的Linux下原生socket的tcp程序及其修改

一個簡單的Linux下原生socket的tcp程序及其修改,最初參考網上資料完成如下:

  1. /*  
  2.  * tcpserver.c  
  3.  *Author:coder_xia  
  4.  * Description:a simple tcp server  
  5.  */  
  6.   
  7. #include <sys/socket.h>  
  8. #include <netinet/in.h> //sockaddr_in  
  9. #include <arpa/inet.h> //inet_addr  
  10. #include <unistd.h> //close  
  11.   
  12. #include <stdio.h>  
  13. #include <stdlib.h>  
  14. #include <string.h>  
  15.   
  16. #define BUFFERSIZE 128  
  17. #define TCPPORT 8001  
  18. #define BACKLOG 5 //max connection number  
  19.   
  20. int main(void) {  
  21.     int server_sockfd, client_sockfd;  
  22.     int addr_len, result, recv_len, on = 1;  
  23.     struct sockaddr_in server_address;  
  24.     struct sockaddr_in client_address;  
  25.     char recvbuf[BUFFERSIZE];  
  26.   
  27.     //init address  
  28.     server_address.sin_family = AF_INET;  
  29.     server_address.sin_addr.s_addr = htonl(INADDR_ANY);  
  30.     server_address.sin_port = htons(TCPPORT);  
  31.     addr_len = sizeof(struct sockaddr_in);  
  32.   
  33.     //new server socket  
  34.     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);  
  35.     if (-1 == server_sockfd) {  
  36.         perror("socket");  
  37.         exit(EXIT_FAILURE);  
  38.     }  
  39.     //Enable address reuse  
  40.     result = setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));  
  41.     //bind and listen  
  42.     result = bind(server_sockfd, (struct sockaddr*)&server_address, addr_len);  
  43.     if (-1 == result) {  
  44.         perror("bind");  
  45.         close(server_sockfd);  
  46.         exit(EXIT_FAILURE);  
  47.     }  
  48.     result = listen(server_sockfd, BACKLOG);  
  49.     if (-1 == result) {  
  50.         perror("listen");  
  51.         close(server_sockfd);  
  52.         exit(EXIT_FAILURE);  
  53.     }  
  54.   
  55.     while (1) {  
  56.         memset(recvbuf, 0, BUFFERSIZE);  
  57.         printf("server is waiting\n");  
  58.         //Accept a connection, accept will block here,  
  59.         //so ,there's no need to sleep in this loop like in udp  
  60.         client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &addr_len);  
  61.         //recv message from client  
  62.         recvrecv_len = recv(client_sockfd, recvbuf, BUFFERSIZE, 0);  
  63.         if (-1 == recv_len) { //error while recv  
  64.             perror("recv");  
  65.             close(client_sockfd);  
  66.             close(server_sockfd);  
  67.             exit(EXIT_FAILURE);  
  68.         } else if (0 == recv_len) { //peer closed the socket  
  69.             close(client_sockfd);  
  70.             close(server_sockfd);  
  71.             exit(EXIT_FAILURE);  
  72.         }  
  73.         printf("server receieve : %s\n", recvbuf);  
  74.         printf("server port : %d\n", ntohs(server_address.sin_port));  
  75.         printf("client port : %d\n", ntohs(client_address.sin_port));  
  76.         printf("client addr : %s\n", inet_ntoa(client_address.sin_addr));  
  77.         //send to client via client_sockfd  
  78.         result = send(client_sockfd, recvbuf, recv_len, 0);  
  79.         if (-1 == result) {  
  80.             perror("send");  
  81.             close(client_sockfd);  
  82.             close(server_sockfd);  
  83.             exit(EXIT_FAILURE);  
  84.         }  
  85.     }  
  86.     close(server_sockfd);  
  87.     return 0;  
  88. }  
Copyright © Linux教程網 All Rights Reserved