Linux C 套接字socket UDP

server端:

                   int sockfd;          sockfd = socket(AF_INET, SOCK_DGRAM, 0);  //创建套接字   SOCK_DGRAM : UDP

                   struct sockaddr_in server_Addr;         serverAddr.sin_family = AF_INET;  //AF_INET : IPv4协议族

                                                                                     serverAddr.sin_port = htons(5678);  //端口号

                                                                                     serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);  //任意本机地址

                   bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr));  //绑定套接口

                   int rcvLen;     rcvLen = recvfrom(sockfd, readbuf, 128, 0, (struct sockaddr *)&clientAddr, &len);  //读取(接收)

                   sendto(sockfd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&clientAddr, len);  //写入(发送)

          

client端:

                    int sockfd;    sockfd = socket(******************);

                    struct sockaddr_in clientAddr;          clientAddr.sin_family = AF_INET;

                                                                                    clientAddr.sin_port = htons(5678);

                                                                                    clientAddr.sin_addr.s_addr = htonl("127.0.0.1");

                    sendto(sockfd, "hello", 6, 0, (struct sockaddr *)&clientAddr, sizeof(struct sockaddr));

                    int rcvLen;       rcvLen = rcvfrom(sockfd, rcvbuf, 128, 0, (struct sockaddr *)clientAddr, &len);



代码(server端):

  1 /*
  2  *  File: UDP_server.c
  3  * 
  4  *  创建套接字、绑定套接字、读写数据、关闭套接字
  5  *
  6  * */
  7 
  8 #include <stdio.h>
  9 #include <netinet/in.h>
 10 #include <string.h>
 11 #include <time.h>
 12 
 13 int main()
 14 {
 15         int sockfd;
 16         struct sockaddr_in serverAddr, clientAddr;
 17         socklen_t len = sizeof(struct sockaddr);
 18 
 19         int rcvLen;
 20         char readbuf[128], sendbuf[128];
 21         time_t mytime;
 22 
 23         sockfd = socket(AF_INET, SOCK_DGRAM, 0);  //创建 套接字
 24         printf("server socket create success. sockfd = %d\n", sockfd);
 25 
 26         serverAddr.sin_family = AF_INET;  //AF_INET  IPv4协议族
 27         serverAddr.sin_port = htons(5678);  //端口号
 28         serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);  //任意本机地址
 29 
 30         bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr));  //绑定套接字 
 31         printf("***********\n");
 32 
 33                 rcvLen = recvfrom(sockfd, readbuf, 128, 0, (struct sockaddr *)(&clientAddr), &len);  //读
 34                 if(rcvLen < 0)
 35                 {
 36                         printf("ERROR: receive failure.\n");
 37                         close(sockfd);
 38                         return -1;
 39                 }
 40 
 41                 printf("client IP: 0x%X, port: %d\n", ntohl(clientAddr.sin_addr.s_addr), ntohs(clientAddr.sin_port));
 42                 printf("receive %d bytes: %s\n", rcvLen, readbuf);
 43                 mytime = time(NULL);
 44                 snprintf(sendbuf, sizeof(sendbuf), "%s", ctime(&mytime));
 45                 sendto(sockfd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&clientAddr, len);  //写
 46 
 47                 bzero(sendbuf, 128);
 48                 snprintf(sendbuf, sizeof(sendbuf), "%s", "华人牌2060款手机傻妞为您服务!请输入开机密码...");
 49                 sendto(sockfd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&clientAddr, len);       //写
 50 
 51                 //bzero(&clientAddr, len);
 52         while(1)
 53         {
 54                 bzero(sendbuf, 128);
 55                 bzero(readbuf, 128);
 56                 recvfrom(sockfd, readbuf, sizeof(readbuf), 0, (struct sockaddr *)&clientAddr, &len);
 57                 printf("client IP: 0X%X, port: %d > %s",
 58                                           ntohl(clientAddr.sin_addr.s_addr), ntohs(clientAddr.sin_port), readbuf);
 59                 printf("可爱的自己 > ");
 60                 fgets(sendbuf, sizeof(sendbuf), stdin);
 61                 sendto(sockfd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&clientAddr, len);
 62         }
 63 
 64         close(sockfd);
 65         return 0;
 66 }


代码(client):

  1 #include <stdio.h>
  2 #include <netinet/in.h>
  3 #include <string.h>
  4 
  5 int main(int argc, char *argv[])
  6 {
  7         int sockfd;
  8 
  9         //short int sin_family; 协议族,在socket编程中 只能是AF_INET
 10         //unsigned short int sin_port;  端口号,使用网络字节顺序
 11         //struct in_addr sin_addr; 含unsigned long s_addr; 存储IP地址
 12         //unsigned char sin_zero[8];
 13         struct sockaddr_in servAddr;    //库 <netinet/in.h>
 14         socklen_t len = sizeof(struct sockaddr);
 15 
 16         int rcvLen;
 17         char rcvbuf[128], sendbuf[128];
 18 
 19         //int socket(int domain, int type, int protocol)
 20         //参数domain;设置网络通信的域,即选择通信协议族。AF_INET为IPv4
 21         //参数type:设置套接字通信的类型,主要有SOCK_STREAM(流式套接字,TCP连接)、SOCK_DGRAM(数据包套接字,UDP连接)
 22         //参数protocol:制定type协议类型中的某个特定类型。通常某协议中只有一种特定类型,即protocol参数仅能设为0
 23         sockfd = socket(AF_INET, SOCK_DGRAM, 0);        //创建 套接字
 24         printf("client socket create success. sockfd = %d\n", sockfd);
 25         printf(" ********************************\n");
 26         //bzero(&servAddr, sizeof(servAddr));   //初始化 servAddr变量
 27         servAddr.sin_family = AF_INET;
 28         servAddr.sin_port = htons(5678);
 29         servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 30 
 31         //client端 connect 连接
 32         //connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr));      //连接 套接字 和 IP
 33         //UDP无须连接,直接发送
 34         sendto(sockfd, "hello\n", 8, 0, (struct sockaddr *)(&servAddr), sizeof(struct sockaddr)); //写
 35 
 36         //rcvLen = read(sockfd, rcvbuf, 128);   //读取 信息
 37         bzero(rcvbuf, sizeof(rcvbuf));
 38         rcvLen = recvfrom(sockfd, rcvbuf, sizeof(rcvbuf), 0, (struct sockaddr *)&servAddr, &len); //读
 39 
 40         if(rcvLen < 0)
 41         {
 42                 printf("ERROR: read failure.\n");
 43                 return -1;
 44         }
 45         if(rcvLen == 0)
 46         {
 47                 printf("Server close connection.\n");
 48                 return -1;
 49         }
 50         printf("receive data[%d bytes]: %s", rcvLen, rcvbuf);
 51 
 52         bzero(rcvbuf, sizeof(rcvbuf));
 53         rcvLen = recvfrom(sockfd, rcvbuf, sizeof(rcvbuf), 0, (struct sockaddr *)&servAddr, &len);
 54         printf("receive data[%d bytes]: %s\n", rcvLen, rcvbuf);
 55         while(1)
 56         {
 57                 bzero(rcvbuf, sizeof(rcvbuf));
 58                 bzero(sendbuf, sizeof(sendbuf));
 59                 printf("me > ");
 60                 fgets(sendbuf, sizeof(sendbuf), stdin);
 61                 sendto(sockfd, sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)&servAddr, len);
 62                 recvfrom(sockfd, rcvbuf, sizeof(rcvbuf), 0, (struct sockaddr *)&servAddr, &len);
 63                 printf("傻妞 IP: 0x%X port: %d > %s\n",
 64                                       ntohl(servAddr.sin_addr.s_addr), ntohs(servAddr.sin_port), rcvbuf);
 65         }
 66         close(sockfd);
 67 
 68         return 0;
 69 }

执行:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值