当前位置:   article > 正文

如何用C语言写一个服务器和客户端(TCP)_cc语言如何创建网络服务端一般包含哪些内容

cc语言如何创建网络服务端一般包含哪些内容

如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西——socket(套接字)。socket(套接字):socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

TCP协议

TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。

关键词:三次握手,可靠,基于字节流。

 

 服务器:

1.创建socket

socket是一个结构体,被创建在内核中

2.调用bind函数

将socket和地址(包括ip、port)绑定。

需要定义一个结构体地址,以便于将port的主机字节序转化成网络字节序

 

3.listen监听,将接收到的客户端连接放入队列

 

4.调用accept函数,从队列获取请求,返回socket描述符

如果无请求,将会阻塞,直到获得连接

5.调用recv/send进行双向通信

6.关闭accept返回的socket

close(sockfd);

以下是服务器的完整代码

  1. #include<stdio.h>
  2. #include<sys/types.h>           
  3. #include<sys/socket.h>
  4. #include<netinet/in.h>
  5. #include<arpa/inet.h>
  6. #include<stdlib.h>
  7. #include<string.h>
  8. #include<unistd.h>
  9. int main(int argc, const char *argv[])
  10. {
  11.     int sfd,cfd,ret;
  12.     char buf[128] ={0};
  13.     ssize_t recv_bytes,send_bytes;
  14.     struct sockaddr_in src,cli;
  15.     socklen_t len = sizeof(src);
  16.     socklen_t addrlen = sizeof(cli);
  17.     if(argc < 3)
  18.     {
  19.         fprintf(stderr,"usage %s ip port \n",argv[0]);
  20.         return -1;
  21.     }
  22.     sfd = socket(AF_INET,SOCK_STREAM,0);
  23.     if(sfd == -1)
  24.     {
  25.         perror("socket fail");
  26.         return -1;
  27.     }
  28.     printf("sfd:%d\n",sfd);
  29.     src.sin_family = AF_INET;
  30.     src.sin_port = htons(atoi(argv[2]));
  31.     src.sin_addr.s_addr = inet_addr(argv[1]);
  32.     ret = bind(sfd,(const struct sockaddr *)&src,len);
  33.     if(ret == -1)
  34.     {
  35.         perror("bind");
  36.         return -1;
  37.     }
  38.     ret = listen(sfd,10);
  39.     if(ret == -1)
  40.     {
  41.         perror("listen");
  42.         return -1;
  43.     }
  44.     cfd = accept(sfd,(struct sockaddr *)&cli,&addrlen);
  45.     if(cfd == -1)
  46.     {
  47.         perror("accept");
  48.         return -1;
  49.     }
  50.     printf("cfd:%d\n",cfd);
  51.     printf("client ip : %s\nport %d\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
  52.     while(1)
  53.     {
  54.         memset(buf,0,sizeof(buf));
  55.       recv_bytes = recv(cfd,buf,sizeof(buf),0);
  56.         if(recv_bytes == -1)
  57.         {
  58.             perror("recv");
  59.             return -1;
  60.         }
  61.         else if(recv_bytes == 0)
  62.         {
  63.             printf("client shutdaown\n");
  64.             break;
  65.         }
  66.         printf("buf :%s\n",buf);
  67.         send_bytes = send(cfd,buf,sizeof(buf),0);
  68.         if(send_bytes == -1)
  69.         {
  70.             perror("send fail");
  71.             return -1;
  72.         }
  73.       
  74.     }
  75.     close(sfd);
  76.     close(cfd);
  77.     return 0;
  78. }

客户端:

客户端相对于服务器写起来只有三个步骤

1.建立 socket,注意使用 SOCK_STREAM

2.连接服务器,发出连接请求

3.数据读写

客户端数据读写与服务端一致

以下是服务器的完整代码

 

  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/socket.h>
  4. #include<netinet/in.h>
  5. #include<arpa/inet.h>
  6. #include<stdlib.h>
  7. #include<string.h>
  8. #include<unistd.h>
  9. int main(int argc, const char *argv[])
  10. {
  11. int sfd,ret;
  12. char buf[128] ={0};
  13. ssize_t send_bytes,recv_bytes;
  14. struct sockaddr_in dest;
  15. socklen_t len = sizeof(dest);
  16. if(argc < 3)
  17. {
  18. fprintf(stderr,"usage %s ip port \n",argv[0]);
  19. return -1;
  20. }
  21. sfd = socket(AF_INET,SOCK_STREAM,0);
  22. if(sfd == -1)
  23. {
  24. perror("socket fail");
  25. return -1;
  26. }
  27. dest.sin_family = AF_INET;
  28. dest.sin_port = htons(atoi(argv[2]));
  29. dest.sin_addr.s_addr = inet_addr(argv[1]);
  30. ret = connect(sfd,(const struct sockaddr *)&dest,len);
  31. if(ret == -1)
  32. {
  33. perror("connect");
  34. return -1;
  35. }
  36. while(1)
  37. {
  38. printf("input ");
  39. memset(buf,0,sizeof(buf));
  40. fgets(buf,sizeof(buf),stdin);
  41. if(strncmp(buf,"quit",4) == 0)
  42. {
  43. printf("client shutdown\n");
  44. break;
  45. }
  46. send_bytes = send(sfd,buf,strlen(buf),0);
  47. if(send_bytes == -1)
  48. {
  49. perror("send fail");
  50. return -1;
  51. }
  52. }
  53. close(sfd);
  54. return 0;
  55. }

 C语言值得你用一生去摸索、学习,你永远都学不到让你满意的程度。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号