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 }
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 }
执行: