当前位置:   article > 正文

C语言 -- 实现服务端和客户端进行TCP通信实例_一个简单的使用c语言实现的tcp客户端和服务器端,可以进行连续双向通信

一个简单的使用c语言实现的tcp客户端和服务器端,可以进行连续双向通信
本文给出一个很实用的C语言实现的服务端和客户端进行TCP通信的小例子。具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考。


(1)客户端程序,编写一个文件client.c,内容如下:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <netdb.h> /* netdb is necessary for struct hostent */
  9. #define PORT 4321 /* server port */
  10. #define MAXDATASIZE 100
  11. int main(int argc, char *argv[])
  12. {
  13. int sockfd, num; /* files descriptors */
  14. char buf[MAXDATASIZE]; /* buf will store received text */
  15. struct hostent *he; /* structure that will get information about remote host */
  16. struct sockaddr_in server;
  17. if (argc != 2)
  18. {
  19. printf("Usage: %s <IP Address>\n",argv[0]);
  20. exit(1);
  21. }
  22. if((he=gethostbyname(argv[1]))==NULL)
  23. {
  24. printf("gethostbyname() error\n");
  25. exit(1);
  26. }
  27. if((sockfd=socket(AF_INET,SOCK_STREAM, 0))==-1)
  28. {
  29. printf("socket() error\n");
  30. exit(1);
  31. }
  32. bzero(&server,sizeof(server));
  33. server.sin_family = AF_INET;
  34. server.sin_port = htons(PORT);
  35. server.sin_addr = *((struct in_addr *)he->h_addr);
  36. if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))==-1)
  37. {
  38. printf("connect() error\n");
  39. exit(1);
  40. }
  41.   
  42.   char str[] = "horst\n"
  43. if((num=send(sockfd,str,sizeof(str),0))==-1){
  44. printf("send() error\n");
  45. exit(1);
  46. }
  47. if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)
  48. {
  49. printf("recv() error\n");
  50. exit(1);
  51. }
  52. buf[num-1]='\0';
  53. printf("server message: %s\n",buf);
  54. close(sockfd);
  55. return 0;
  56. }

(2)服务器端,编写server.c,内容如下
  1. #include <sys/time.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #define PORT 4321
  11. #define BACKLOG 1
  12. #define MAXRECVLEN 1024
  13. int main(int argc, char *argv[])
  14. {
  15. char buf[MAXRECVLEN];
  16. int listenfd, connectfd; /* socket descriptors */
  17. struct sockaddr_in server; /* server's address information */
  18. struct sockaddr_in client; /* client's address information */
  19. socklen_t addrlen;
  20. /* Create TCP socket */
  21. if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  22. {
  23. /* handle exception */
  24. perror("socket() error. Failed to initiate a socket");
  25. exit(1);
  26. }
  27. /* set socket option */
  28. int opt = SO_REUSEADDR;
  29. setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  30. bzero(&server, sizeof(server));
  31. server.sin_family = AF_INET;
  32. server.sin_port = htons(PORT);
  33. server.sin_addr.s_addr = htonl(INADDR_ANY);
  34. if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1)
  35. {
  36. /* handle exception */
  37. perror("Bind() error.");
  38. exit(1);
  39. }
  40. if(listen(listenfd, BACKLOG) == -1)
  41. {
  42. perror("listen() error. \n");
  43. exit(1);
  44. }
  45. addrlen = sizeof(client);
  46. while(1){
  47. if((connectfd=accept(listenfd,(struct sockaddr *)&client, &addrlen))==-1)
  48. {
  49. perror("accept() error. \n");
  50. exit(1);
  51. }
  52. struct timeval tv;
  53. gettimeofday(&tv, NULL);
  54. printf("You got a connection from client's ip %s, port %d at time %ld.%ld\n",inet_ntoa(client.sin_addr),htons(client.sin_port), tv.tv_sec,tv.tv_usec);
  55. int iret=-1;
  56. while(1)
  57. {
  58. iret = recv(connectfd, buf, MAXRECVLEN, 0);
  59. if(iret>0)
  60. {
  61. printf("%s\n", buf);
  62. }else
  63. {
  64. close(connectfd);
  65. break;
  66. }
  67. /* print client's ip and port */
  68. send(connectfd, buf, iret, 0); /* send to the client welcome message */
  69. }
  70. }
  71. close(listenfd); /* close listenfd */
  72. return 0;
  73. }

(3)编译运行


以上两个程序放在同一个目录下,比如 /home/horstxu/Cprog/tcpCSmodel


命令行进入该目录 $ cd /home/horstxu/Cprog/tcpCSmodel


命令行执行 $ gcc -o client client.c ,可以编译出客户端程序。


命令行执行 $ gcc -o server server.c,可以编译出服务端程序。


命令行执行 $ ./server,启动server程序。


这时你可能需要重新打开一个命令行窗口,到刚才的目录下,执行 $ ./client 127.0.0.1,启动客户端程序,就可以看到结果了。


客户端:



服务器端:




本程序客户端会自动退出,服务器不会,因此如果想停掉服务器程序,直接在命令行界面按键盘Ctrl+C停止。


程序实现的功能很简单,就是服务器监听4321端口,客户端与之建立TCP连接后,再发送字符串“horst\n”到服务端,服务端打印出来,然后再把字符串传回给客户端,客户端再打印出来。然后客户端关闭连接退出,而服务端继续监听4321端口等待下一次连接。


本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-05/116897.htm
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/144126?site
推荐阅读
相关标签
  

闽ICP备14008679号