• 网络编程day02(socket套接字)


    今日任务:

    TCP\UDP服务端客户端通信

    TCP:代码

    服务端:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. //自定义报错提示
    9. #define ERR_MSG(msg) do{\
    10. fprintf(stderr,"__%d__",__LINE__);\
    11. perror(msg);\
    12. }while(0)
    13. #define SER_PORT 8888
    14. #define SER_IP "192.168.125.2"
    15. /*
    16. * function: TCP服务端
    17. * @param [ in]
    18. * @param [out]
    19. * @return
    20. */
    21. int main(int argc, const char *argv[])
    22. {
    23. //1.创建socket套接字,
    24. int sfd=socket(AF_INET,SOCK_STREAM,0);
    25. if(sfd<0){
    26. ERR_MSG("socket");
    27. return -1;
    28. }
    29. puts("socket create");
    30. //允许端口快速复用
    31. int reuse = 1;
    32. if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    33. {
    34. ERR_MSG("setsockopt");
    35. return -1;
    36. }
    37. printf("允许端口快速复用成功\n");
    38. //2.绑定服务器IP和端口号bind
    39. struct sockaddr_in addr;
    40. addr.sin_family=AF_INET;
    41. addr.sin_port=htons(SER_PORT);
    42. addr.sin_addr.s_addr=inet_addr(SER_IP);
    43. if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){
    44. ERR_MSG("bind");
    45. return -1;
    46. }
    47. puts("bind success");
    48. //3.建立监听listen
    49. if(listen(sfd,128)<0){
    50. ERR_MSG("listen");
    51. return -1;
    52. }
    53. puts("listen suucess");
    54. //4.等待客户端连接, accept
    55. struct sockaddr_in cli_addr;
    56. socklen_t cli_addrlen=sizeof(cli_addr);
    57. int cfd=accept(sfd,(struct sockaddr*)&cli_addr,&cli_addrlen);
    58. if(cfd<0){
    59. ERR_MSG("accept");
    60. return -1;
    61. }
    62. puts("accept");
    63. //5.接受发送消息recv;send
    64. char buf[128];
    65. while(1){
    66. bzero(buf,sizeof(buf));
    67. int recv_res=recv(cfd,buf,sizeof(buf),0);
    68. if(recv_res<0){
    69. ERR_MSG("recv");
    70. return -1;
    71. }else if(recv_res==0){
    72. printf("socket peer has shutdown\n");
    73. break;
    74. }
    75. puts("recv success");
    76. printf("[%s:%d]:%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buf);
    77. if(strcmp(buf,"quit")==0)
    78. break;
    79. strcat(buf,"-----i has received");
    80. int send_res=send(cfd,buf,sizeof(buf),0);
    81. if(send_res<0){
    82. ERR_MSG("send");
    83. return -1;
    84. }
    85. puts("send success");
    86. }
    87. //6.关闭
    88. close(cfd);
    89. close(sfd);
    90. return 0;
    91. }

    客户端

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. //自定义报错提示
    9. #define ERR_MSG(msg) do{\
    10. fprintf(stderr,"__%d__",__LINE__);\
    11. perror(msg);\
    12. }while(0)
    13. #define SER_PORT 8888
    14. #define SER_IP "192.168.125.2"
    15. /*
    16. * function: TCP客户端
    17. * @param [ in]
    18. * @param [out]
    19. * @return
    20. */
    21. int main(int argc, const char *argv[])
    22. {
    23. //1.创建socket套接字,
    24. int cfd=socket(AF_INET,SOCK_STREAM,0);
    25. if(cfd<0){
    26. ERR_MSG("socket");
    27. return -1;
    28. }
    29. puts("socket create");
    30. //允许端口快速复用
    31. int reuse = 1;
    32. if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    33. {
    34. ERR_MSG("setsockopt");
    35. return -1;
    36. }
    37. printf("允许端口快速复用成功\n");
    38. //2.连接服务端connect
    39. struct sockaddr_in addr;
    40. addr.sin_family=AF_INET;
    41. addr.sin_port=htons(SER_PORT);
    42. addr.sin_addr.s_addr=inet_addr(SER_IP);
    43. if(connect(cfd,(struct sockaddr*)&addr,sizeof(addr))<0){
    44. ERR_MSG("connect");
    45. return -1;
    46. }
    47. puts("connect success");
    48. //5.接受发送消息recv;send
    49. char buf[128];
    50. while(1){
    51. bzero(buf,sizeof(buf));
    52. printf("请输入>>>");
    53. fgets(buf,sizeof(buf),stdin);
    54. buf[strlen(buf)-1]='\0';
    55. if(strcmp(buf,"quit")==0)
    56. break;
    57. int send_res=send(cfd,buf,sizeof(buf),0);
    58. if(send_res<0){
    59. ERR_MSG("send");
    60. return -1;
    61. }
    62. puts("send success");
    63. bzero(buf,sizeof(buf));
    64. int recv_res=recv(cfd,buf,sizeof(buf),0);
    65. if(recv_res<0){
    66. ERR_MSG("recv");
    67. return -1;
    68. }else if(recv_res==0){
    69. printf("socket peer has shutdown\n");
    70. break;
    71. }
    72. puts("recv success");
    73. printf("[%s:%d]:%s\n",SER_IP,SER_PORT,buf);
    74. }
    75. //6.关闭
    76. close(cfd);
    77. return 0;
    78. }

    运行结果:

    UDP:代码

    服务端:

    1. #include
    2. #include
    3. #include
    4. #include /* See NOTES */
    5. #include
    6. #include
    7. #include
    8. #include
    9. //自定义报错提示
    10. #define ERR_MSG(msg) do{\
    11. fprintf(stderr,"__%d__",__LINE__);\
    12. perror(msg);\
    13. }while(0)
    14. #define SER_PORT 8888
    15. #define SER_IP "192.168.125.2"
    16. int main(int argc, const char *argv[])
    17. {
    18. //1.创建socket套接字
    19. int sfd=socket(AF_INET,SOCK_DGRAM,0);
    20. if(sfd<0){
    21. ERR_MSG("socket");
    22. return -1;
    23. }
    24. puts("socket success");
    25. //2.绑定IP和端口号
    26. struct sockaddr_in addr;
    27. addr.sin_family=AF_INET;
    28. addr.sin_port=htons(SER_PORT);
    29. addr.sin_addr.s_addr=inet_addr(SER_IP);
    30. if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){
    31. ERR_MSG("bind");
    32. return -1;
    33. }
    34. puts("bind success");
    35. //3.接受和发送消息
    36. //
    37. struct sockaddr_in src_addr;
    38. socklen_t addrlen=sizeof(src_addr);
    39. char buf[128];
    40. while(1){
    41. bzero(buf,sizeof(buf));
    42. int recv_res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&src_addr,&addrlen);
    43. if(recv_res<0){
    44. ERR_MSG("recvfrom");
    45. return -1;
    46. }
    47. puts("recvfrom success");
    48. printf("[%s:%d]:%s\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port),buf);
    49. if(strcmp(buf,"quit")==0)
    50. break;
    51. strcat(buf,"-----i has received");
    52. int send_res=sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&src_addr,addrlen);
    53. if(send_res<0){
    54. ERR_MSG("sendto");
    55. return -1;
    56. }
    57. puts("sendto success");
    58. }
    59. //4.关闭
    60. close(sfd);
    61. return 0;
    62. }

    客户端

    1. #include
    2. #include
    3. #include
    4. #include /* See NOTES */
    5. #include
    6. #include
    7. #include
    8. #include
    9. //自定义报错提示
    10. #define ERR_MSG(msg) do{\
    11. fprintf(stderr,"__%d__",__LINE__);\
    12. perror(msg);\
    13. }while(0)
    14. #define SER_PORT 8888
    15. #define SER_IP "192.168.125.2"
    16. int main(int argc, const char *argv[])
    17. {
    18. //1.创建socket套接字
    19. int cfd=socket(AF_INET,SOCK_DGRAM,0);
    20. if(cfd<0){
    21. ERR_MSG("socket");
    22. return -1;
    23. }
    24. puts("socket success");
    25. //3.接受和发送消息
    26. //目标地址信息
    27. struct sockaddr_in addr;
    28. addr.sin_family=AF_INET;
    29. addr.sin_port=htons(SER_PORT);
    30. addr.sin_addr.s_addr=inet_addr(SER_IP);
    31. socklen_t addrlen=sizeof(addr);
    32. //记录接受信息的目标地址信息
    33. struct sockaddr_in recv_addr;
    34. socklen_t recv_addrlen=sizeof(recv_addr);
    35. char buf[128];
    36. while(1){
    37. printf("请输入>>>");
    38. fgets(buf,sizeof(buf),stdin);
    39. buf[strlen(buf)-1]='\0';
    40. int send_res=sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&addr,addrlen);
    41. if(send_res<0){
    42. ERR_MSG("sendto");
    43. return -1;
    44. }
    45. puts("sendto success");
    46. if(strcmp(buf,"quit")==0)
    47. break;
    48. bzero(buf,sizeof(buf));
    49. int recv_res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&recv_addr,&recv_addrlen);
    50. if(recv_res<0){
    51. ERR_MSG("recvfrom");
    52. return -1;
    53. }
    54. puts("recvfrom success");
    55. printf("[%s:%d]:%s\n",inet_ntoa(recv_addr.sin_addr),ntohs(recv_addr.sin_port),buf);
    56. }
    57. //4.关闭
    58. close(cfd);
    59. return 0;
    60. }

    运行结果:

    今日思维导图

    somthing error:UDP的客户端处

    一开始addrlen只有定义没有赋值,白天的时候有报错给他加了一个初始值;晚上突然一下可以一下不可以,找了找错误改了医改,应该也是这个;

  • 相关阅读:
    代码随想录二刷 Day 44
    产成品差异科目有余额物料分类账帐以后没有结转完
    Sqlserver Try Catch时Catch捕获到错误则重试一次的写法
    骨传导麦克风+耳塞模式,打开飞利浦A7607的“隐藏功能”
    STM32实战总结:HAL之DAC
    Vue-配置代理(解决跨域问题)
    CListCtrl设置只显示单列
    Python学习笔记之分支结构与循环结构
    计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程
    基于Python+Flask+MySQL+HTML的B站数据可视化分析系统
  • 原文地址:https://blog.csdn.net/weixin_53762703/article/details/133047919