UDP传输
传输流程图:
1.单播
发送者:
1.打开socket
connfd = socket(AF_INET,SOCK_DGRAM,0);
2.设置发送地址和端口
struct sockaddr_in si;
si.sin_family = AF_INET; // 套接字地址簇,一般使用AF_INET
si.sin_port = htons(端口); // 16位端口,网络序
si.sin_addr.s_addr = inet_addr(IP地址); // IP地址,网络序
3.发送数据
sendto(connfd,buf,buf_size,0,(struct sockaddr *)&si,sizeof(si));
4.关闭socket
close(connfd);
接收者:
1.打开socket
connfd = socket(AF_INET,SOCK_DGRAM,0);
2.设置发送地址和端口
struct sockaddr_in si;
si.sin_family = AF_INET; // 套接字地址簇,一般使用AF_INET
si.sin_port = htons(端口); // 16位端口,网络序
si.sin_addr.s_addr = inet_addr(IP地址); // IP地址,网络序
3.端口绑定
int ret = bind(connfd, (struct sockaddr *)&si, sizeof(si));
4.接受数据
recv(connfd,buf,buf_size,0);
5.关闭socket
close(connfd);
示例:
unicast_send:
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#define BUFFER_SIZE 1024
int main(int argc,char **argv) {
if(4 != argc){
printf("usage:%s <IP> <Port> <MSG>\n",argv[0]);
}
char *ip=argv[1]; //目的主机IP地址
int port = atoi(argv[2]);//目的主机端口号
// 1. 打开socket
int connfd= socket(PF_INET,SOCK_DGRAM,0);
assert(udpfd >= 0);
// 2. 设置发送地址和端口
struct sockaddr_in address; //目的主机地址
bzero(&address,sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port);
inet_pton(AF_INET,ip,&address.sin_addr);
// 3. 发送数据
sendto(connfd,argv[3],strlen(argv[3])+1,0,(struct sockaddr *)&address,sizeof(address));
// 4. 关闭socket
close(connfd);
return 0;
}
unicast_recv:
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#define BUFFER_SIZE 1024
int main(int argc,char **argv) {
if(3 != argc) {
printf("usage:%s <IP> <Port> \n",argv[0]);
}
char *ip = argv[1];