Linux编程之UDP SOCKET全攻略(2)

#include <sys/types.h> #include <sys/socket.h> ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

第一个参数sockfd:正在监听端口的套接口文件描述符,通过socket获得

第二个参数buf:发送缓冲区,往往是使用者定义的数组,该数组装有要发送的数据

第三个参数len:发送缓冲区的大小,单位是字节

第四个参数flags:填0即可

第五个参数dest_addr:指向接收数据的主机地址信息的结构体,也就是该参数指定数据要发送到哪个主机哪个进程

第六个参数addrlen:表示第五个参数所指向内容的长度

返回值:成功:返回发送成功的数据长度

           失败: -1

#include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

第一个参数sockfd:正在监听端口的套接口文件描述符,通过socket获得

第二个参数buf:接收缓冲区,往往是使用者定义的数组,该数组装有接收到的数据

第三个参数len:接收缓冲区的大小,单位是字节

第四个参数flags:填0即可

第五个参数src_addr:指向发送数据的主机地址信息的结构体,也就是我们可以从该参数获取到数据是谁发出的

第六个参数addrlen:表示第五个参数所指向内容的长度

返回值:成功:返回接收成功的数据长度

        失败: -1

#include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);

第一个参数sockfd:正在监听端口的套接口文件描述符,通过socket获得

第二个参数my_addr:需要绑定的IP和端口

第三个参数addrlen:my_addr的结构体的大小

返回值:成功:0

        失败:-1

#include <unistd.h> int close(int fd);

close函数比较简单,只要填入socket产生的fd即可。

3. 搭建UDP通信框架

server:

1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <netinet/in.h> 5 #include <string.h> 6 7 #define SERVER_PORT 8888 8 #define BUFF_LEN 1024 9 10 void handle_udp_msg(int fd) 11 { 12 char buf[BUFF_LEN]; //接收缓冲区,1024字节 13 socklen_t len; 14 int count; 15 struct sockaddr_in clent_addr; //clent_addr用于记录发送方的地址信息 16 while(1) 17 { 18 memset(buf, 0, BUFF_LEN); 19 len = sizeof(clent_addr); 20 count = recvfrom(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&clent_addr, &len); //recvfrom是拥塞函数,没有数据就一直拥塞 21 if(count == -1) 22 { 23 printf("recieve data fail!\n"); 24 return; 25 } 26 printf("client:%s\n",buf); //打印client发过来的信息 27 memset(buf, 0, BUFF_LEN); 28 sprintf(buf, "I have recieved %d bytes data!\n", count); //回复client 29 printf("server:%s\n",buf); //打印自己发送的信息给 30 sendto(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&clent_addr, len); //发送信息给client,注意使用了clent_addr结构体指针 31 32 } 33 } 34 35 36 /* 37 server: 38 socket-->bind-->recvfrom-->sendto-->close 39 */ 40 41 int main(int argc, char* argv[]) 42 { 43 int server_fd, ret; 44 struct sockaddr_in ser_addr; 45 46 server_fd = socket(AF_INET, SOCK_DGRAM, 0); //AF_INET:IPV4;SOCK_DGRAM:UDP 47 if(server_fd < 0) 48 { 49 printf("create socket fail!\n"); 50 return -1; 51 } 52 53 memset(&ser_addr, 0, sizeof(ser_addr)); 54 ser_addr.sin_family = AF_INET; 55 ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,需要进行网络序转换,INADDR_ANY:本地地址 56 ser_addr.sin_port = htons(SERVER_PORT); //端口号,需要网络序转换 57 58 ret = bind(server_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr)); 59 if(ret < 0) 60 { 61 printf("socket bind fail!\n"); 62 return -1; 63 } 64 65 handle_udp_msg(server_fd); //处理接收到的数据 66 67 close(server_fd); 68 return 0; 69

client:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e884fc907c7cb6e51ddb774aac5a39b7.html