TCP/UDP的网络套接字操作

一、TCP的网络编程操作

1、TCP服务器编程步骤:

①. 创建一个socket,用函数socket()
②. 绑定IP地址、端口等信息到socket上,用函数bind()
③.设置允许的最大连接数,用函数listen()
④.接收客户端上来的连接,用函数accept()
⑤.收发数据,用函数send()和recv(),或者read()和write()
⑥.关闭网络连接

2、TCP客户端编程步骤:

①.创建一个socket,用函数socket()
②.设置要连接的对方的IP地址和端口等属性
③.连接服务器,用函数connect()
④.收发数据,用函数send()和recv(),或者read()和write()
⑤.关闭网络连接


关于上述两个的编写流程具体如下图所示,在创建套接字时指定类型为AF_INET及SOCK_STREAM,即TCP(IPV4协议下),同时注意,客户端与服务器的连接和三次握手发生在accept函数下,listen函数只是创建了socket的监听的模式。

                                            

3、TCP的服务器和客户端的编程实例

针对上次提到的各种网络编程的C函数,这里我们根据上面的流程来分别创建TCP服务器和TCP客户端,实现TCP客户端发送消息到服务器中并让服务器打印发送的消息

(1)TCP服务器

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <arpa/inet.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7.   
  8. #define MAX_SIZE 512   
  9. #define PORT 3332 //端口号  
  10.   
  11. int main()  
  12. {  
  13.     int sockfd;  
  14.     int sock_fd;  
  15.     int recvnum;  
  16.     int addrlen = sizeof(struct sockaddr);  
  17.   
  18.     struct sockaddr_in my_addr;  
  19.     struct sockaddr addr;  
  20.   
  21.     char buf[MAX_SIZE];  
  22.   
  23.    // 填充服务器端的资料,用于套接字绑定  
  24.     bzero(&my_addr,sizeof(struct sockaddr_in));  
  25.   
  26.     my_addr.sin_family = AF_INET; //设置为IPV4  
  27.     my_addr.sin_port = htons(PORT); //将端口号主机序转换为网络序  
  28.     my_addr.sin_addr.s_addr = inet_addr("192.168.1.132"); //IP设置为192.168.1.132  
  29.   
  30.     //创建套接字,TCP/IPV4  
  31.     sockfd = socket(AF_INET,SOCK_STREAM,0);  
  32.     if(sockfd < 0)  
  33.     {  
  34.         printf("create socket error!\n");  
  35.         exit(1);  
  36.     }  
  37.   
  38.     //绑定套接字  
  39.     if(bind(sockfd,(struct sockaddr*)&my_addr,addrlen) < 0)  
  40.     {  
  41.         printf("bind error\n!");  
  42.         exit(1);  
  43.     }  
  44.   
  45.     //监听端口和IP,允许客户端最大数目为3  
  46.     if(listen(sockfd,3) < 0)  
  47.     {  
  48.         printf("listen error!\n");  
  49.         exit(1);  
  50.     }  
  51.       
  52.     //建立服务器和客户端连接  
  53.     sock_fd = accept(sockfd,&addr,&addrlen);//建立连接后产生新的套接字描述符  
  54.       
  55.     if(sock_fd < 0)  
  56.     {  
  57.         printf("accept error!\n");  
  58.         exit(1);  
  59.     }  
  60.   
  61.     //接收数据  
  62.     if((recvnum = recv(sock_fd,(void *)buf,MAX_SIZE,0)) < 0)  
  63.     {  
  64.         printf("recv error!\n");  
  65.         exit(1);  
  66.     }  
  67.       
  68.     buf[recvnum]='\0';  
  69.     printf("recv from client: %s\n",buf);  
  70.   
  71.     memset(buf,0,MAX_SIZE);  
  72.           
  73.     //关闭连接  
  74.     close(sock_fd);  
  75.     close(sockfd);  
  76.   
  77.     return 0;  
  78. }  
  79. </span>  
(2)TCP客户端

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <sys/socket.h>  
  5. #include <sys/types.h>  
  6. #include <arpa/inet.h>  
  7.   
  8. #define MAX_SIZE 512  
  9. #define PORT 3332 //端口号  
  10.   
  11. int main()  
  12. {  
  13.     int sockfd;  
  14.     int addrlen = sizeof(struct sockaddr);  
  15.   
  16.     char buf[MAX_SIZE];  
  17.   
  18.     struct sockaddr_in serv_addr;  
  19.   
  20.     //填充服务器端资料  
  21.     bzero(&serv_addr,sizeof(struct sockaddr_in));  
  22.   
  23.     serv_addr.sin_family = AF_INET;  
  24.     serv_addr.sin_port = ntohs(PORT);  
  25.     serv_addr.sin_addr.s_addr = inet_addr("192.168.1.132");  
  26.       
  27.     //创建套接字,IPV4/TCP  
  28.     sockfd = socket(AF_INET,SOCK_STREAM,0);  
  29.     if(sockfd < 0)  
  30.     {  
  31.         printf("create socket error!\n");  
  32.         exit(1);  
  33.     }  
  34.           
  35.     //连接服务器  
  36.     if(connect(sockfd,(struct sockaddr *)&serv_addr,addrlen) < 0)  
  37.     {  
  38.         printf("connect error !\n");  
  39.         exit(1);  
  40.     }  
  41.   
  42.     memset(buf,0,MAX_SIZE);  
  43.     printf("enter some text:");  
  44.     scanf("%s",buf);  
  45.   
  46.     //发送数据到服务器  
  47.     if(send(sockfd,(void *)buf,MAX_SIZE,0) < 0)  
  48.     {  
  49.         printf("send error!\n");  
  50.         exit(1);  
  51.     }  
  52.       
  53.     //关闭连接  
  54.     close(sockfd);  
  55.   
  56.     return 0;  
  57. }  
  58. </span>  


二、UDP的网络编程操作

1、UDP的服务器编程步骤:

①.创建一个socket,用函数socket()
②.绑定IP地址、端口等信息到socket上,用函数bind()
③.循环接收数据,用函数recvfrom()
④.关闭网络连接


2、UDP的客户端编程步骤:

①.创建一个socket,用函数socket()
②.绑定IP地址、端口等信息到socket上,用函数bind()
③.设置对方的IP地址和端口等属性
④.发送数据,用函数sendto()
⑤.关闭网络连接


上述两个的编写流程具体如下图所示,在创建套接字时指定类型为AF_INET及SOCK_DGRAM,即UCP(IPV4协议下),这里和TCP的编程步骤有些不同,在于UDP不用进行三次握手建立连接。

                                                           

3、UDP的服务器和客户端的编程实例

这里我们根据上面的流程来分别创建UCP服务器和UCP客户端,实现UCP客户端发送消息到服务器中并让服务器打印发送的消息,UDP服务器也可以发送消息到客户端并让客户端打印读取的信息。

(1)UDP服务器

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <errno.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <arpa/inet.h>  
  8.   
  9. #define PORT 3212  
  10. #define MAX_SIZE 512  
  11.   
  12. int main()  
  13. {  
  14.     int sockfd;  
  15.     int len = sizeof(struct sockaddr);  
  16.   
  17.     char buf[MAX_SIZE];  
  18.     char buffer[MAX_SIZE];  
  19.   
  20.     struct sockaddr_in serv_addr;  
  21.       
  22.     //创建套接字,IPV4/UDP  
  23.     sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  24.     if(sockfd < 0)  
  25.     {  
  26.         printf("create socket error!\n");  
  27.         exit(1);  
  28.     }  
  29.   
  30.     //填充服务器信息  
  31.     bzero(&serv_addr,sizeof(struct sockaddr_in));  
  32.     serv_addr.sin_family = AF_INET;  
  33.     serv_addr.sin_port = htons(PORT);  
  34.     serv_addr.sin_addr.s_addr = inet_addr("192.168.1.132");  
  35.   
  36.     //绑定套接字  
  37.     if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) < 0)  
  38.     {  
  39.         printf("bind error!\n");  
  40.         exit(1);  
  41.     }  
  42.   
  43.     //循环接收网络上发送来的数据并回复消息  
  44.     while(1)  
  45.     {  
  46.         //接收数据  
  47.         if(recvfrom(sockfd,buf,MAX_SIZE,0,(struct sockaddr*)&serv_addr,&len) < 0)  
  48.         {  
  49.             printf("recv error!\n");  
  50.             exit(1);  
  51.         }  
  52.         printf("recv is: %s\n ",buf);  
  53.               
  54.       
  55.         printf("write some text:");  
  56.         scanf("%s",buffer);  
  57.           
  58.         //发送数据  
  59.         if(sendto(sockfd,buffer,MAX_SIZE,0,(struct sockaddr*)&serv_addr,len) < 0)  
  60.         {  
  61.             printf("send error!\n");  
  62.             fprintf(stderr,"send error:%s\n",strerror(errno));  
  63.             exit(1);  
  64.         }    
  65.     }  
  66.   
  67.     //关闭socket  
  68.     close(sockfd);  
  69.   
  70.   
  71.     return 0;  
  72. }  
  73. </span>  

(2)UDP客户端

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <errno.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <arpa/inet.h>  
  8.   
  9. #define PORT 3212  
  10. #define MAX_SIZE 512  
  11.   
  12. int main()  
  13. {  
  14.     int sockfd;  
  15.     int fromlen = sizeof(struct sockaddr);  
  16.   
  17.     char buf[MAX_SIZE];  
  18.     char buffer[MAX_SIZE];  
  19.   
  20.     struct sockaddr_in serv_addr;  
  21.   
  22.     //填充服务器信息  
  23.     bzero(&serv_addr,sizeof(struct sockaddr_in));  
  24.     serv_addr.sin_family = AF_INET;  
  25.     serv_addr.sin_port = htons(PORT);  
  26.     serv_addr.sin_addr.s_addr = inet_addr("192.168.1.132");  
  27.   
  28.     //创建套接字  
  29.     sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  30.     if(sockfd < 0)  
  31.     {  
  32.         printf("create socket error!\n");  
  33.         exit(1);  
  34.     }  
  35.   
  36.     //循环发送数据到服务器及接收服务器的回复信息  
  37.     while(1)  
  38.     {  
  39.         printf("enter some text:");  
  40.         scanf("%s",buf);  
  41.   
  42.         //发送数据  
  43.         if(sendto(sockfd,buf,MAX_SIZE,0,(const struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) < 0)  
  44.         {  
  45.             printf("send error!\n");  
  46.             fprintf(stderr,"send error:%s\n",strerror(errno));  
  47.             exit(1);  
  48.   
  49.         }  
  50.   
  51.         //接收数据  
  52.        if(recvfrom(sockfd,buffer,MAX_SIZE,0,(struct sockaddr*)&serv_addr,&fromlen) < 0)  
  53.         {  
  54.             printf("recv error!\n");  
  55.             exit(1);  
  56.         }  
  57.         printf("recv is %s\n",buffer);  
  58.     }  
  59.   
  60.     //关闭socket  
  61.     close(sockfd);  
  62.   
  63.     return 0;  
  64. }  
  65. </span>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值