udp编程
int sendto (int s, const void *buf, int len, unsigned int flags, const struct sockaddr *to, int tolen);
int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
sendto(),是把UDP数据报发给指定地址;
recvfrom()是从指定地址接收UDP数据报。
参数说明
\s: socket描述符。
\buf: UDP数据报缓存地址。
\len: UDP数据报长度。
\flags: 该参数一般为0。
\to: sendto()函数参数,struct sockaddr_in类型,指明UDP数据发往哪里报。
\tolen: 对方地址长度,一般为:sizeof(struct sockaddr_in)。
\fromlen: recvfrom()函数参数,struct sockaddr_in类型,指明从哪里接收UDP数据报。
udp_server
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #define UDP_TEST_PORT 50001 int main(int argC, char* arg[]) { struct sockaddr_in addr; int sockfd, len = 0; int addr_len = sizeof(struct sockaddr_in); char buffer[256]; /* 建立socket,注意必须是SOCK_DGRAM */ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror ("socket"); exit(1); } /* 填写sockaddr_in 结构 */ bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(UDP_TEST_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY) ;// 接收任意IP发来的数据 /* 绑定socket */ if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0) { perror("connect"); exit(1); } while(1) { bzero(buffer, sizeof(buffer)); len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&addr ,&addr_len); /* 显示client端的网络地址和收到的字符串消息 */ printf("Received a string from client %s, string is: %s\n", inet_ntoa(addr.sin_addr), buffer); /* 将收到的字符串消息返回给client端 */ sendto(sockfd,buffer, len, 0, (struct sockaddr *)&addr, addr_len); } return 0; }
udp_client
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #define UDP_TEST_PORT 50001 #define UDP_SERVER_IP "127.0.0.1" int main(int argC, char* arg[]) { struct sockaddr_in addr; int sockfd, len = 0; int addr_len = sizeof(struct sockaddr_in); char buffer[256]; /* 建立socket,注意必须是SOCK_DGRAM */ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } /* 填写sockaddr_in*/ bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(UDP_TEST_PORT); addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP); while(1) { bzero(buffer, sizeof(buffer)); printf("Please enter a string to send to server: \n"); /* 从标准输入设备取得字符串*/ len = read(STDIN_FILENO, buffer, sizeof(buffer)); /* 将字符串传送给server端*/ sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len); /* 接收server端返回的字符串*/ len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&addr, &addr_len); printf("Receive from server: %s\n", buffer); } return 0; }
udp_s
#include<stdio.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<stdlib.h> #include<netinet/in.h> #include<arpa/inet.h> #define PORT 1234 #define MAXDATASIZE 100 int main() { int sockfd; struct sockaddr_in server; struct sockaddr_in client; socklen_t addrlen; int num; char buf[MAXDATASIZE]; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("Creatingsocket failed."); exit(1); } bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr= htonl (INADDR_ANY); if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1) { perror("Bind()error."); exit(1); } addrlen=sizeof(client); while(1) { num =recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr*)&client,&addrlen); if (num < 0) { perror("recvfrom() error\n"); exit(1); } buf[num] = '\0'; printf("You got a message (%s%) from client.\nIt's ip is%s, port is %d.\n",buf,inet_ntoa(client.sin_addr),htons(client.sin_port)); sendto(sockfd,"Welcometo my server.\n",22,0,(struct sockaddr *)&client,addrlen); if(!strcmp(buf,"bye")) break; } close(sockfd); }
udp_c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #define PORT 1234 #define MAXDATASIZE 100 int main(int argc, char *argv[]) { int sockfd, num; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in server,peer; if (argc !=3) { printf("Usage: %s <IP Address><message>\n",argv[0]); exit(1); } if ((he=gethostbyname(argv[1]))==NULL) { printf("gethostbyname()error\n"); exit(1); } if ((sockfd=socket(AF_INET, SOCK_DGRAM,0))==-1) { printf("socket() error\n"); exit(1); } bzero(&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr= *((struct in_addr *)he->h_addr); sendto(sockfd, argv[2],strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(server)); socklen_t addrlen; addrlen=sizeof(server); while (1) { if((num=recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&peer,&addrlen))== -1) { printf("recvfrom() error\n"); exit(1); } if (addrlen != sizeof(server) ||memcmp((const void *)&server, (const void *)&peer,addrlen) != 0) { printf("Receive message from otherserver.\n"); continue; } buf[num]='\0'; printf("Server Message:%s\n",buf); break; } close(sockfd); }
本博客内容均来自网络,如有雷同,是我抄袭!