Linux中的tcp udp的send、recv、sendto和recvfrom接口

参考:https://blog.csdn.net/u014507230/article/details/45311033

send() 和recv() 
系统调用send()的用法如下:
int send(int sockfd, const void* msg, int len, int flags); 
第一个参数是你希望给发送数据的套接口文件描述符。它可以是你通过socket()系统调用返回的,也可以是通过accept()系统调用得到的。
第二个参数是指向你希望发送的数据的指针。
第三个参数是数据的字节长度。第四个参数标志设置为0。
下面是一个简单的例子:
char*msg="Beejwashere!";
intlen,bytes_sent;
..
len=strlen(msg);
bytes_sent=send(sockfd, msg, len, 0);
... 
系统调用send()返回实际发送的字节数,这可能比你实际想要发送的字节数少。如果返回的字节数比要发送的字节数少,你在以后必须发送剩下的数据。当send()出错时,将返回-1。
系统调用recv()的使用方法和send()类似:
int recv(int sockfd, void* buf, int len, unsigned int flags); 
第一个参数是要读取的套接口文件描述符。
第二个参数是保存读入信息的地址。
第三个参数是缓冲区的最大长度。第四个参数设置为0。
系统调用recv()返回实际读取到缓冲区的字节数,如果出错则返回-1。
这样使用上面的系统调用,你可以通过数据流套接口来发送和接受信息。 
--------------------------------------------------------------------------------

sendto() 和recvfrom() 
因为数据报套接口并不连接到远程的主机上,所以在发送数据包之前,我们必须首先给出目的地址,请看:
int sendto(int sockfd, const void* msg, int len, unsigned int flags,
conststruct sockaddr*to, inttolen); 
除了两个参数以外,其他的参数和系统调用send()时相同。
参数to是指向包含目的IP地址和端口号的数据结构sockaddr的指针。
参数tolen可以设置为sizeof(structsockaddr)。
系统调用sendto()返回实际发送的字节数,如果出错则返回-1。
系统调用recvfrom()的使用方法也和recv()的十分近似:
int recvfrom(int sockfd, void* buf, int len, unsigned int flags
struct sockaddr* from, int* fromlen); 
参数from是指向本地计算机中包含源IP地址和端口号的数据结构sockaddr的指针。
参数fromlen设置为sizeof(struct sockaddr)。
系统调用recvfrom()返回接收到的字节数,如果出错则返回-1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++进行UDPTCP通信的流程和API如下: UDP通信流程: 1. 创建socket对象:使用socket()函数创建socket对象 2. 绑定本地IP地址和端口号:使用bind()函数绑定本地IP地址和端口号 3. 发送数据:使用sendto()函数发送数据 4. 接收数据:使用recvfrom()函数接收数据 UDP通信API: 1. 创建socket对象:int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 2. 绑定本地IP地址和端口号:struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); 3. 发送数据:struct sockaddr_in destAddr; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(targetPort); destAddr.sin_addr.s_addr = inet_addr(targetIP.c_str()); sendto(sockfd, data.c_str(), data.size(), 0, (struct sockaddr *)&destAddr, sizeof(destAddr)); 4. 接收数据:struct sockaddr_in srcAddr; socklen_t len = sizeof(srcAddr); char buffer[1024]; int n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&srcAddr, &len); // 处理接收到的数据 TCP通信流程: 1. 创建socket对象:使用socket()函数创建socket对象 2. 绑定本地IP地址和端口号:使用bind()函数绑定本地IP地址和端口号 3. 监听端口号:使用listen()函数监听端口号 4. 接受连接:使用accept()函数接受连接请求,创建新的socket对象 5. 发送数据:使用send()函数发送数据 6. 接收数据:使用recv()函数接收数据 TCP通信API: 1. 创建socket对象:int sockfd = socket(AF_INET, SOCK_STREAM, 0); 2. 绑定本地IP地址和端口号:struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); 3. 监听端口号:listen(sockfd, backlog); 4. 接受连接:struct sockaddr_in clientAddr; socklen_t len = sizeof(clientAddr); int clientSockfd = accept(sockfd, (struct sockaddr *)&clientAddr, &len); 5. 发送数据send(clientSockfd, data.c_str(), data.size(), 0); 6. 接收数据:char buffer[1024]; int n = recv(clientSockfd, buffer, sizeof(buffer), 0); // 处理接收到的数据 注意:以上代码只是简单的示例,实际应用需要对各种错误进行处理,例如错误码的返回值等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值