❤️强烈推荐人工智能学习网站❤️
sendto用于UDP发送数据,send用于TCP发送数据.我们知道TCP中的send成功返回表示应用进程已成功将数据写入发送缓冲区,不表示数据已成功到达对端。而对于sendto成功返回,也只是表明接口输出队列中具有存放所形成IP数据包的空间,UDP是没有发送缓冲区的。来看一段代码:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#define MAXLINE 4096
int main()
{
int i;
int sockfd;
struct sockaddr_in seraddr;
sockfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family=AF_INET;
seraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
seraddr.sin_port=htons(8888);
char buf[100]="11111111111";
i=sendto(sockfd,buf,sizeof(buf)+1,0,(sockaddr *)&seraddr,sizeof(sockaddr));
printf("i=%d\n",i);
getchar();
exit(0);
}
这是一段基于UDP的客户端的代码,编译并运行,此时并没有运行相应的服务端。此时sendto也成功返回了,如下:
[mapan@localhost UDP]$ ./client
i=101
这里显然sendto是发送错的,但没有返回错误。unix网络编程中有一句话:未连接的UDP套接字不会收到任何异步错误。