当前位置:   article > 正文

C语言模拟TCP通信-------收发数据_c 基于sockettcp接收

c 基于sockettcp接收

 简介

这篇是我学习网络编程时初次接触到的,感觉挺适合初学者,下文主要介绍了如何使用Linux模拟TCP通信,分为客户端和服务器端两大部分,外加一个总的头文件

 流程

 服务器端和客户端使用TCP的流程如下所示

 

 所用函数

 (1) socket():该函数用于创建一个套接字,同时指定协议和类型。
 (2) bind():该函数将保存在相应地址结构中的地址信息与套接字进行绑定,它主要用于服务器端,客户端创建的套接字可以不绑定定地址。
(3)listen():在服务器端程序成功建立套接字并与地址进行绑定之后通过调用listen()函数将套接字设置成监听模式(被动模式),准备接收客户端的连接请求。
(4)accept():服务器端通过调用accept()函数等待并接收客户端的连接请求。建立好 TCP 连接后,该函数会返回一个新的已连接套接字。

(5)connect():客户端通过该函数向服务器端的监听套接字发送连接请求。
(6)send()和recv():这两个函数通常在 TCP 通信过程中用于发送和接收数据,也可以用在 UDP 中。
(7)sendto()和 recvfrom():这两个函数一般在 UDP 通信过程中用于发送和接收数据。当用在 TCP 时,后面的几个与地址有关的参数不起作用,函数作用等同于 send ()和recv()。

 头文件

  1. #ifndef _NET_H
  2. #define _NET_H
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netinet/ip.h>
  10. #include <arpa/inet.h>
  11. #endif

 客户端

步骤

     创建发送端Socket对象(创建连接)
     获取输出流对象
     发送数据
     释放资源

  1. #include "net.h"
  2. int tcp_connect(const char *ip,int port);
  3. int tcp_connect(const char *ip,int port)
  4. {
  5. //1,创建socket对象,流式套接字
  6. //参数1 地址族 AF_INET表示IPV4协议
  7. //参数2 套接字类型 SOCK_STREAM表示流式套接字 适用于TCP协议
  8. //参数3 一般为0
  9. int tcp_socket=socket(AF_INET,SOCK_STREAM,0);
  10. if(tcp_socket<0)
  11. {
  12. perror("socket error\n");
  13. return -1;
  14. }
  15. printf("socket ok\n");
  16. //2.设置对方的IP地址和端口号
  17. //2.1定义一个结构体,赋值
  18. struct sockaddr_in server;
  19. server.sin_family=AF_INET;//IPV4
  20. server.sin_port=htons(port);//端口号
  21. server.sin_addr.s_addr=inet_addr(ip);//转换成网络字节序
  22. //3,请求连接
  23. //参数1 socket 对象
  24. //参数2 struct socket * 实际struct socksddr_in
  25. if(connect(tcp_socket,(struct sockaddr *)&server,sizeof(server))<0)
  26. {
  27. perror("connect error");
  28. return -1;
  29. }
  30. printf("connect ok\n");
  31. return tcp_socket;
  32. }
  33. int main(int argc, const char *argv[])
  34. {
  35. //1,创建socket对象,流氏套接字
  36. //2.设置对方的IP地址和端口号
  37. //3,请求连接
  38. //4.发送接受消息
  39. //5.关闭socket对象
  40. if(argc<3)
  41. {
  42. printf("输入错误,请重新输入\n");
  43. exit(1);
  44. }
  45. int tcp_socket=tcp_connect(argv[1],atoi(argv[2]));
  46. char buf[20]={'\0'};
  47. fgets(buf,sizeof(buf),stdin);
  48. send(tcp_socket,buf,strlen(buf),0);
  49. //5关闭socket对象
  50. close(tcp_socket);
  51. return 0;
  52. }

 服务器端

步骤:
         创建接收端Socket对象
         监听
         获取输入流对象
         获取数据
         输出数据
         释放资源

  1. #include "net.h"
  2. int tcp_server(const char *ip,int port);
  3. int tcp_server(const char *ip,int port)
  4. {
  5. //1,创建socket对象,流式套接字
  6. //参数1 地址族 AF_INET表示IPV4协议
  7. //参数2 套接字类型 SOCK_STREAM表示流式套接字 适用于TCP协议
  8. //参数3 一般为0
  9. int tcp_socket=socket(AF_INET,SOCK_STREAM,0);
  10. if(tcp_socket<0)
  11. {
  12. perror("socket error\n");
  13. return -1;
  14. }
  15. //2.设置对方的IP地址和端口号
  16. //2.1定义一个结构体,赋值
  17. struct sockaddr_in server;
  18. memset(&server,'\0',sizeof(server));
  19. server.sin_family=AF_INET;//IPV4
  20. server.sin_port=htons(port);//端口号
  21. server.sin_addr.s_addr=inet_addr(ip);//转换成网络字节序
  22. //3,请求连接
  23. //参数1 socket 对象
  24. //参数2 struct socket * 实际struct socksddr_in
  25. if(bind(tcp_socket,(struct sockaddr *)&server,sizeof(server))<0)
  26. {
  27. perror("bind error\n");
  28. return -1;
  29. }
  30. printf("bind ok\n");
  31. if(listen(tcp_socket,5)<0)
  32. {
  33. perror("listen error");
  34. }
  35. printf("listen ok\n");
  36. return tcp_socket;
  37. }
  38. int main(int argc, const char *argv[])
  39. {
  40. //1.socket对象,流氏套接字
  41. //2.设置对方的IP地址和端口号
  42. //3.请求连接
  43. //4.发送接受消息
  44. //5.关闭socket对象
  45. if(argc!=3)
  46. {
  47. printf("输入错误,请重新输入\n");
  48. exit(1);
  49. }
  50. int tcp_socket=tcp_server(argv[1],atoi(argv[2]));
  51. int newfd=0;
  52. struct sockaddr_in client;
  53. int len=sizeof(client);
  54. newfd=accept(tcp_socket,(struct sockaddr *)&client,&len);
  55. if(newfd<0)
  56. {
  57. perror("accept error");
  58. return -1;
  59. }
  60. printf("accept ok\n");
  61. printf("client ip:%s port:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
  62. char buf[20]={'\0'};
  63. recv(newfd,buf,sizeof(buf),0);
  64. printf("%s\n",buf);
  65. //5.关闭socket对象
  66. close(tcp_socket);
  67. return 0;
  68. }

小结

以上就是小编边学边码出来的,如有不对,请多指正~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/144124
推荐阅读
相关标签
  

闽ICP备14008679号