歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 簡單的Linux下原生socket的tcp程序及其修改

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

日期:2017/3/1 10:28:52   编辑:Linux編程

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

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