文章目录
4. socket操作(UDP)
4.1 客户端(发送端)
socket创建
int socket(int domain, int type, int protocol)
sendto发送
发送ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
参数 | 含义 |
---|---|
sockfd | sockfd文件描述符 |
buf | 写入数据 |
len | 写入数据的长度 |
flags | 通常为0 |
dest_addr | 目标socket地址 |
addrlen | 目标socket地址长度 |
返回值:
返回值 | 含义 |
---|---|
>0 | 实际所写的字节数 |
<0 | 出错 |
// 发送
string s;
getline(cin,s);
sendto(fd,s.c_str(),s.size()+1,0,(sockaddr*)&addr,sizeof(addr));
4.2 服务器(接收端)
bind绑定
和TCP一样
// 绑定
bind(fd,(sockaddr*)&addr,sizeof(addr));
recv接收
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数 | 含义 |
---|---|
fd | 文件描述符 |
buf | 读取数据 |
len | 读取数据的长度 |
flags | 通常为0 |
返回值:
返回值 | 含义 |
---|---|
0 | 读到文件的结束 |
>0 | 实际所读的字节数 |
<0 | 出错 |
// 接收
char buffer[1024] = {
0};
recv(fd,buffer,1023,0);
cout << buffer << endl;
4.3 客户端和服务器的程序
客户端:发送端
#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <thread>
using namespace std;
int main(int argc,char* argv[]){
if(3 != argc){
printf("argument error\n");
printf("Usage:%s recv_ip recv_port\n",argv[0]);
return 1;
}
int fd = socket(AF_INET,SOCK_DGRAM,0); // socket类型为数据报类型
if(-1 == fd){
perror("open socket error");
return 1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
inet_aton(argv[1],&addr.sin_addr);
addr.sin_port = htons(atoi(argv[2])); // atoi把字符串转为数字
// 发送
string s;
getline(cin,s);
sendto(fd,s.c_str(),s.size()+1,0,(sockaddr*)&addr,sizeof(addr));
close(fd);