udp socket
相关知识
UDP的程序设计可以分成客户端和服务器端两个部分。两者的主要差别在于对地址的绑定函数,客户端可以不用进行地质和端口的绑定。(客户端是随机拿一个大于1024的端口去连接的)
和TCP相比,UDP缺少connect(),listen(),accept()函数 【因为tcp面向连接,而UDP是无连接的。】
服务端的UDP编程:
动作 | 函数 |
---|---|
创建 | socket() |
绑定 | bind() |
发送 | sendto() |
接收 | recvfrom() |
关闭 | close() |
客户端和服务端相比没有绑定bind()的步骤。
服务端的recvfrom是阻塞的,直到接收到数据。
关键词:数据包套接字,套接字文件描述符。
socket常见的套接字类型:
- AF_INET(又称 PF_INET)是IPv4网络协议的套接字类型
- AF_INET6 是IPv6网络协议的套接字类型
- AF_UNIX 属于Unix系统本地通信
socket常见的套接字选项:
SOCK_STREAM | SOCK_DGRAM |
---|---|
数据流 | 数据包 |
有保障 | 无保障 |
面向连接 | 面向无连接 |
TCP/IP | UDP |
int s=socket(AF_INET,SOCK_DGRAM,0);
if(s==-1){
perror("create socket: ");
return -1;
}
struct sockaddr serv;
serv.sin_family=AF_INET;
serv.sin_addr.s_addr=htol(INADDR_ANY); // 任意本地IP,网络字节序
serv.sin_port=htos(PORT); //网络字节序
bind(s,(struct sockaddr*)&serv,sizeof(serv)); //绑定套接字和地址
解释“绑定套接字和地址”,实质上是指明发送数据的IP和端口。
截图来自: http://blog.csdn.net/xiongping_/article/details/47722049
关于sockaddr和sockaddr_in的区别:
http://blog.csdn.net/joeblackzqq/article/details/8258693
它们的联系:
udp socket 例子
编写一个程序,使用udp通信,client是10.21.1.142, server是10.21.1.229,port是3000. client发送end能使得程序结束。
客户端:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 3000
int main(){
int s=socket(AF_INET,SOCK_DGRAM,0);
if(s==-1){
perror("create socket error: ");
exit(1);
}
struct sockaddr_in serv;
bzero(&serv,sizeof(serv));
serv.sin_family=AF_INET;
serv.sin_addr.s_addr = inet_addr("10.21.1.229"); //htonl(INADDR_ANY);
serv.sin_port=htons(PORT);
char buff[105];
int ret;
while(1){
ret=read(STDIN_FILENO,buff,105);
if(ret==-1){
perror("read error: ");
break;
}
buff[ret]=0;
sendto(s,buff,strlen(buff),0,(struct sockaddr *)&serv,sizeof(serv));
if(strcmp(buff,"end\n")==0){
printf("client process end.\n");
break;
}
int addr_len=sizeof(serv);
if((ret=recvfrom(s,buff,105,0,(struct sockaddr *)&serv,&addr_len))==-1){
perror("recvform error: ");
break;
}
buff[ret]=0;
printf("receive message from server: %s",buff);
}
close(s);
return