• TCP/UDP协议传输


    TCP

    客户端

    1. #include <stdio.h>
    2. #include <sys/types.h>
    3. #include <sys/socket.h>
    4. #include <unistd.h>
    5. #include <arpa/inet.h>
    6. #include <netinet/in.h>
    7. #include <string.h>
    8. //宏定义错误输出格式>>>>类比封装函数
    9. #define ERR_MSG(msg) do{\
    10. fprintf(stderr,"line:%d",__LINE__);\
    11. perror("msg");\
    12. }while(0);
    13. #define IP "192.168.124.62"
    14. #define PORT 8888
    15. int main(int argc, const char *argv[])
    16. {
    17. //创建流式套接字
    18. int cfd = socket(AF_INET,SOCK_STREAM,0);
    19. if(cfd<0)
    20. {
    21. ERR_MSG("scoket");
    22. return -1;
    23. }
    24. printf("创建流式套接字成功 cfd %d\n",cfd);
    25. //填充服务器的地址信息结构体
    26. //真实的地址信息结构体根据地址族来制定
    27. struct sockaddr_in sin;
    28. //写一个包含ip端口的构造体
    29. sin.sin_family = AF_INET;
    30. sin.sin_port = htons(PORT);
    31. sin.sin_addr.s_addr = inet_addr(IP);
    32. //连接指定的服务器
    33. if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    34. {
    35. ERR_MSG("connect");
    36. return -1;
    37. }
    38. printf("[%s:%d]服务器连接成功\n",IP,PORT);
    39. char buf[128];
    40. ssize_t res;
    41. while(1)
    42. {
    43. bzero(buf,sizeof(buf));
    44. //发送
    45. printf("请输入>>>>");
    46. fgets(buf,sizeof(buf),stdin);
    47. buf[strlen(buf)-1] = '\0';
    48. if(send(cfd,buf,sizeof(buf),0)<0)
    49. {
    50. ERR_MSG("send");
    51. return -1;
    52. }
    53. printf("发送成功\n");
    54. //接收
    55. bzero(buf,sizeof(buf));
    56. res = recv(cfd,buf,sizeof(buf),0);
    57. if(res < 0)
    58. {
    59. ERR_MSG("recv");
    60. return -1;
    61. }else if(res == 0)
    62. {
    63. printf("[%s:%d]服务器下线\n",IP,PORT);
    64. break;
    65. }
    66. printf("[%s:%d] newfd=%d : %s\n",IP,PORT,cfd,buf);
    67. }
    68. close (cfd);
    69. return 0;
    70. }

    服务器端

    1. #include <stdio.h>
    2. #include <sys/types.h>
    3. #include <sys/socket.h>
    4. #include <unistd.h>
    5. #include <arpa/inet.h>
    6. #include <netinet/in.h>
    7. #include <string.h>
    8. #define PORT 8888 //1014~49151
    9. #define IP "192.168.124.62"
    10. #define ERR_MSG(msg) do{\
    11. fprintf(stderr,"line:%d",__LINE__);\
    12. perror(msg);\
    13. }while(0)
    14. int main(int argc, const char *argv[])
    15. {
    16. //创建流式套接字
    17. int sfd = socket(AF_INET,SOCK_STREAM,0);
    18. if(sfd<0)
    19. {
    20. ERR_MSG("socket");
    21. return -1;
    22. }
    23. printf("流式套接字创建成功 sfd=%d\n",sfd);
    24. //允许端口快速被复用
    25. int reuse = 1;
    26. if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    27. {
    28. ERR_MSG("setsockopt");
    29. return -1;
    30. }
    31. printf("允许端口被重复使用\n");
    32. //填充服务器的地址信息结构体,给bind函数使用
    33. //真实的地址信息结构体根据地址族制定,AF_LNET-->>man 7 ipp
    34. struct sockaddr_in sin;
    35. sin.sin_family = AF_INET;
    36. sin.sin_port = htons(PORT);
    37. sin.sin_addr.s_addr = inet_addr(IP);
    38. //绑定服务器的地址信息,必须绑定
    39. if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    40. {
    41. ERR_MSG("bind");
    42. return -1;
    43. }
    44. printf("绑定成功!\n");
    45. //将套接字设置尾监听状态
    46. if(listen(sfd,128)<0)
    47. {
    48. ERR_MSG("listen");
    49. return -1;
    50. }
    51. printf("监听成功!\n");
    52. //获取连接成功的客户端信息,生成一个新的套接字文件描述符
    53. struct sockaddr_in cin;
    54. socklen_t addrlen = sizeof(cin);
    55. int newfd = accept(sfd,(struct sockaddr*)&cin ,&addrlen);
    56. if(newfd<0)
    57. {
    58. ERR_MSG("accept");
    59. return -1;
    60. }
    61. printf("[%s:%d] newfd=%d 客户端连接成功\n",\
    62. inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
    63. //接收
    64. char buf[128];
    65. ssize_t res;
    66. while(1)
    67. {
    68. bzero(buf,sizeof(buf));
    69. res = recv(newfd,&buf,sizeof(buf),0);
    70. if(res<0)
    71. {
    72. ERR_MSG("recv");
    73. return -1;
    74. }else if(res == 0)
    75. {
    76. printf("[%s:%d]客户端下线\n",\
    77. inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
    78. break;
    79. }
    80. printf("[%s:%d]newfd=%d : %s\n",\
    81. inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);
    82. //发送
    83. printf("请输入>>>>");
    84. fgets(buf,sizeof(buf),stdin);
    85. buf[strlen(buf)-1] = '\0';
    86. if(send(newfd,buf,sizeof(buf),0)<0)
    87. {
    88. ERR_MSG("send");
    89. return -1;
    90. }
    91. printf("发送成功\n");
    92. }
    93. //关闭
    94. close (newfd);
    95. if(close(sfd)<0)
    96. {
    97. ERR_MSG("close");
    98. return -1;
    99. }
    100. return 0;
    101. }

    UDP

    服务器端

    1. #include <stdio.h>
    2. #include <sys/types.h>
    3. #include <sys/socket.h>
    4. #include <netinet/ip.h>
    5. #include <netinet/in.h>
    6. #include <string.h>
    7. #include <arpa/inet.h>
    8. #include <unistd.h>
    9. #define PORT 6666
    10. #define IP "192.168.124.62"
    11. #define ERR_MSG(msg) do{\
    12. fprintf(stderr,"line:%d\n",__LINE__);\
    13. perror(msg);\
    14. }while(0)
    15. int main(int argc, const char *argv[])
    16. {
    17. int fd = socket(AF_INET,SOCK_DGRAM,0);
    18. if(fd<0)
    19. {
    20. ERR_MSG("scoket");
    21. return -1;
    22. }
    23. printf("创建流式套接字成功\n");
    24. //允许端口被重复使用
    25. int reuse = 1;
    26. if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    27. {
    28. ERR_MSG("setsockopt");
    29. return -1;
    30. }
    31. printf("允许端口被重复使用\n");
    32. //绑定服务器地址信息,必须绑定
    33. struct sockaddr_in sin;
    34. sin.sin_family = AF_INET;
    35. sin.sin_port = htons(PORT);
    36. sin.sin_addr.s_addr= inet_addr(IP);
    37. if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)
    38. {
    39. ERR_MSG("bind");
    40. return -1;
    41. }
    42. printf("绑定成功\n");
    43. //接收数据
    44. char arr[128] = "";
    45. struct sockaddr_in cin;
    46. socklen_t addrlen = sizeof(cin);
    47. while(1)
    48. {
    49. bzero(arr,sizeof(arr));//清空arr数据
    50. if(recvfrom(fd,arr,sizeof(arr),0,(struct sockaddr*)&cin,&addrlen) < 0)
    51. {
    52. ERR_MSG("recvfrom");
    53. return -1;
    54. }
    55. printf("[%s:%d] arr=%s\n",\
    56. inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),arr);
    57. //发送数据
    58. strcat(arr,"hello word");
    59. if(sendto(fd,arr,sizeof(arr),0,\
    60. (struct sockaddr*)&cin,sizeof(cin))<0)
    61. {
    62. ERR_MSG("sendto");
    63. return -1;
    64. }
    65. printf("发送成功\n");
    66. }
    67. close(fd);
    68. return 0;
    69. }

    客户端

    1. #include <stdio.h>
    2. #include <sys/types.h>
    3. #include <sys/socket.h>
    4. #include <netinet/in.h>
    5. #include <string.h>
    6. #include <arpa/inet.h>
    7. #include <unistd.h>
    8. #define PORT 6666
    9. #define IP "192.168.124.62"
    10. #define ERR_MSG(msg) do{\
    11. fprintf(stderr,"line:%d\n",__LINE__);\
    12. perror(msg);\
    13. }while(0)
    14. int main(int argc, const char *argv[])
    15. {
    16. int fd = socket(AF_INET,SOCK_DGRAM,0);
    17. if(fd<0)
    18. {
    19. ERR_MSG("scoket");
    20. return -1;
    21. }
    22. printf("创建流式套接字成功cd=%d\n",fd);
    23. /* //允许端口被重复使用
    24. int reuse = 1;
    25. if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    26. {
    27. ERR_MSG("setsockopt");
    28. return -1;
    29. }
    30. printf("允许端口被重复使用\n");
    31. */ //绑定服务器地址信息,必须绑定
    32. struct sockaddr_in sin;
    33. sin.sin_family = AF_INET;
    34. sin.sin_port = htons(PORT);
    35. sin.sin_addr.s_addr= inet_addr(IP);
    36. /* //绑定IP及端口号
    37. if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)
    38. {
    39. ERR_MSG("bind");
    40. return -1;
    41. }
    42. printf("绑定成功\n");
    43. */
    44. char arr[128];
    45. struct sockaddr_in cin;
    46. socklen_t addrlen = sizeof(arr);
    47. while(1)
    48. {
    49. bzero(arr,sizeof(arr));//清空arr数据
    50. //发送数据
    51. printf("请输入数据>>>>>");
    52. fgets(arr,sizeof(arr),stdin);
    53. arr[strlen(arr)-1] = '\0';
    54. if(sendto(fd,arr,sizeof(arr),0,\
    55. (struct sockaddr*)&sin,sizeof(sin))<0)
    56. {
    57. ERR_MSG("sendto");
    58. return -1;
    59. }
    60. printf("发送成功\n");
    61. bzero(arr,sizeof(arr));
    62. //接收数据
    63. if(recvfrom(fd,arr,sizeof(arr),0,\
    64. (struct sockaddr*)&cin,&addrlen)<0)
    65. {
    66. ERR_MSG("recvfrom");
    67. return -1;
    68. }
    69. printf("[%s:%d] arr=%s\n",\
    70. inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),arr);
    71. }
    72. close(fd);
    73. return 0;
    74. }

  • 相关阅读:
    Hive 和 Spark 分区策略剖析
    【uni-app】响应式单位rpx
    大数据开发之词频统计传参打包成jar包发送到Hadoop运行并创建可执行文件方便运行
    JVM学习(宋红康)之运行时数据区之虚拟机栈中栈帧的动态链接及方法调用
    深圳NPDP认证|如何做好一个B端产品经理?
    Deeplab系列算法
    少儿编程竞赛概览
    <能力清单>笔记与思考
    PoE交换机出现不稳定的原因有哪些?
    全解MySQL之各方位事无巨细的剖析存储过程与触发器!
  • 原文地址:https://blog.csdn.net/qq_42129915/article/details/139813525