解读linux sendto函数的返回值 (linux sendto 返回值)

解读Linux sendto函数的返回值

在网络编程中,发送数据是很常见的操作。而在Linux系统中,作为网络编程基础函数之一的sendto函数,其返回值非常重要。在本文中,我们将对Linux sendto函数的返回值进行解读,并帮助读者更好地理解和使用该函数。

一、sendto函数概述

sendto函数是Linux网络编程中用于发送数据的基础函数之一。在使用该函数时,我们首先需要创建一个套接字(socket),然后使用sendto函数将数据发送到一个指定的地址和端口。

sendto函数的语法如下:

“`

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

“`

其中,sockfd是一个已经创建好的套接字;buf指向要发送的数据的缓冲区;len是数据的长度;flags是选项标志,用于控制sendto的行为;dest_addr是指定目标地址的sockaddr结构体指针;addrlen是dest_addr结构体的长度。

sendto函数的返回值是一个long类型的整数,表示发送的字节数。而该函数的返回值还包含了一些重要的信息,需要我们进行解读。

二、sendto函数的返回值

sendto函数的返回值不仅表示发送的数据长度,还包含了一些其他的信息。具体来说,sendto函数的返回值有以下几种可能:

1.返回值大于0

如果sendto函数的返回值大于0,则表示数据已经成功发送到了目标地址。返回值代表成功发送的字节数。

2.返回值等于0

如果sendto函数的返回值等于0,则表示发送的数据长度为0。可能出现这种情况的原因是buf指向的空间长度为0,或者在使用UDP协议时,sendto函数成功地发送了0字节的数据。

3.返回值等于-1,并且errno为EINTR

如果sendto函数的返回值等于-1,并且errno为EINTR,则表示sendto函数被一个信号中断了。在这种情况下,我们可以使用一个循环来尝试重新发送数据。

4.返回值等于-1,并且errno为EAGN/EWOULDBLOCK

如果sendto函数的返回值等于-1,并且errno为EAGN(或者EWOULDBLOCK),则表示数据发送被阻塞了。在这种情况下,我们可以尝试重新发送数据,也可以暂时挂起当前进程,等待数据发送的条件。

5.返回值等于-1,并且errno为其他值

如果sendto函数的返回值等于-1,并且errno为其他值,则表示发送数据的过程中发生了错误。具体的错误码可以参考Linux中的errno.h头文件。

需要注意的是,sendto函数的返回值并不能完全说明发送数据的情况。即使sendto函数返回了一个大于0的值,并不能保证数据已经真正到达了目标地址。这是因为UDP协议并不保证数据的可靠传输,数据可能会丢失或者出现乱序的情况。因此,在实际使用时,我们需要使用一些其他的手段来确保数据的可靠传输。

三、

sendto函数作为Linux网络编程中非常重要的函数之一,其返回值具有很大的意义。在本文中,我们对sendto函数的返回值进行了解读,并介绍了不同情况下,sendto函数的返回值代表的含义。

需要注意的是,sendto函数的返回值仅仅代表了数据是否已经发送成功,但并不能保证数据是否已经真正到达目标地址。因此,在使用sendto函数时,我们需要采用其他方法来确保数据的可靠传输。

相关问题拓展阅读:

基于Linux的远程指令系统(使用udp而不是tcp)

一. Linux下UDP编程框架

使用UDP进行程序设计可以分为客户端和服务器端两部分。

1.服务器端程序包括:

? 建立套接字

? 将套接字地址结构进行绑定

? 读写数据

? 关闭套接字

2.客户端程序包括:

? 建立套接字

? 读写数据

? 关闭套接字

3.服务器端和客户端程序之间的差别

服务器端和客户端两个流程之间的主要差别在于对地址的绑定函数(bind()函数),而客户端可以不用进行地址和端口的绑定操作。

二.Linux中UDP套接字函数

从图可知,UDP协议的服务端程序设计的流程分为套接字建立,套接字与地址结构进行绑定,收发数据,关闭套接字;客户端程序流程为套接字建立,收发数据,关闭套接字等过程。它们分别对应socket(),bind(),sendto(),recvfrom(),和close()函数。

网络程序通过调用socket()函数,会返回一个用于通信的套接字描述符。Linux应用程序在执行任何形式的I/嫌誉唤O操作的时候,程序是在读或者写一个文件描述符。因此,可以把创建的套接字描述符看成普通的描述符来操作,并通过读写套接字描述符来实现网络之间的数据交流。

1. socket

1> 函数原型:

int socket(int domain,int type,int protocol)

2> 函数功能:芹凯

函数socket()用于创建一个套接字描述符。

3> 形参:

? domain:用于指定创建套接字所使用的协议族,在头文件

中定义。

常见的协议族如下:

AF_UNIX:创建只在本机内进行通信的套接字。

AF_INET:使用IPv4 TCP/IP协议

AF_INET6:使用IPv6 TCP/IP协议

说明:

AF_UNIX只能用于单一的UNIX系统进程间通信,而AF_INET是针对Interne的,因而可以允许在远程主机之间通信。一般把它赋为AF_INET。

? type:指明套接的类型,对应的参数如下

SOCK_STREAM:创建TCP流套接字

SOCK_DGRAM:创建UDP数据报套接字

SOCK_RAW:创建原始套接字

? protocol:

参数protocol通常设置为0,表示通过参数domain指定的协议族和参数type指定的套接字类型来确定使用的协议。当为原始套接字时,系统无法唯一的确定协议,此时就需要使用使用该参数指定所使用的协议。

4> 返回值:执行成功后返回一个新创建的套接字;若有错误发生则返回一个-1,错误代码存入errno中。

5> 举例:调用socket函数创建一个UDP套接字

int sock_fd;

sock_fd = socket(AF_INET,SOCK_DGRAM,0);

if(sock_fd 函数原型:

int bind(int sockfd,struct sockaddr *my_addr,socklen_taddrlen)

2> 函数功能

函数bind()的作用是将一个套接字文件描述符与一个本地地址绑定在一起。

3> 形参:

? sockfd:sockfd是调用socket函数返回的文件描述符;

? addrlen是sockaddr结构的长度。

? my_addr: 是一个指向sockaddr结构的指针,它保存着本地套接字的地址(即端口和IP地址)信息。不过由于系统兼容性的问题,一般不使用这个结构,而使用另外一个结构(struct sockaddr_in)来代替

4> 套接字地址结构:

(1)structsockaddr:

结构struct sockaddr定义了一种通用的套接字地址,它在

Linux/socket.h 中定义。

struct sockaddr{

unsigned short sa_family;/*地址类型,AF_XXX*/

char sa_data;/*14字节的协议地址*/

}

a. sin_family:表示地址类型,对于使用TCP/IP协议进行的网络编程,该值只能是AF_INET.

b. sa_data:存储具体的协议地址。

(2)sockaddr_in

每种协议虚饥族都有自己的协议地址格式,TCP/IP协议组的地址格式为结构体struct sockaddr_in,它在netinet/in.h头文件中定义。

struct sockaddr_in{

unsigned short sin_family;/*地址类型*/

unsigned short sin_port;/*端口号*/

struct in_addr sin_addr;/*IP地址*/

unsigned char sin_zero;/*填充字节,一般赋值为0*/

}

a. sin_family:表示地址类型,对于使用TCP/IP协议进行的网络编程,该值只能是AF_INET.

b. sin_port:是端口号

c. sin_addr:用来存储32位的IP地址。

d. 数组sin_zero为填充字段,一般赋值为0.

e. structin_addr的定义如下:

struct in_addr{

unsignedlong s_addr;

}

结构体sockaddr的长度为16字节,结构体sockaddr_in的长度为16字节。可以将参数my_addr的sin_addr设置为INADDR_ANY而不是某个确定的IP地址就可以绑定到任何网络接口。对于只有一IP地址的计算机,INADDR_ANY对应的就是它的IP地址;对于多宿主主机(拥有多个网卡),INADDR_ANY表示本服务器程序将处理来自所有网络接口上相应端口的连接请求

5> 返回值:

函数成功后返回0,当有错误发生时则返回-1,错误代码存入errno中。

6>举例:调用socket函数创建一个UDP套接字

struct sockaddr_in addr_serv,addr_client;/*本地的地址信息*/

memset(&serv_addr,0,sizeof(struct sockaddr_in));

addr_serv.sin_family = AF_INET;/*协议族*/

addr_serv.sin_port = htons(SERV_PORT);/*本地端口号*/

addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); /*任意本地地址*/

/*套接字绑定*/

if(bind(sock_fd,(struct sockaddr *)&addr_serv),sizeof(structsockaddr_in)) 函数原型:

int close(intfd);

2>函数功能:

函数close用来关闭一个套接字描述符。

3>函数形参:

? 参数fd为一个套接字描述符。

4>返回值:

执行成功返回0,出错则返回-1.错误代码存入errno中。

说明:

以上三个函数中,前两个要包含头文件

#include

#include

后一个包含:

#include

4.sendto

1>函数原型:

#include

#include

ssize_t sendo(ints,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_ttolen);

2>函数功能:

向目标主机发送消息

3>函数形参:

? s:套接字描述符。

? *msg:发送缓冲区

? len:待发送数据的长度

? flags:控制选项,一般设置为0或取下面的值

(1)MSG_OOB:在指定的套接字上发送带外数据(out-of-band data),该类型的套接字必须支持带外数据(eg:SOCK_STREAM).

(2)MSG_DONTROUTE:通过最直接的路径发送数据,而忽略下层协议的路由设置。

? to:用于指定目的地址

? tolen:目的地址的长度。

4>函数返回值:

执行成功后返回实际发送数据的字节数,出错返回-1,错误代码存入errno中。

5>函数举例:

char send_buf;

struct sockaddr_in addr_client;

memset(&addr_client,0,sizeof(struct sockaddr_in));

addr_client.sin_family = AF_INET;

addr_client.sin_port = htons(DEST_PORT);

if(inet_aton(“172.17.242.131”,&addr_client.sin_addr)函数原型:

#include

#include

ssize_t recvfrom(int s,void *buf,size_t len,intflags,struct sockaddr *from,socklen_t *fromlen);

2>函数功能:接收数据

3>函数形参:

? int s:套接字描述符

? buf:指向接收缓冲区,接收到的数据将放在这个指针所指向的内存空间。

? len:指定了缓冲区的大小。

? flags:控制选项,一般设置为0或取以下值

(1)MSG_OOB:请求接收带外数据

(2)MSG_PEEK:只查看数据而不读出

(3)MSG_WAITALL:只在接收缓冲区时才返回。

? *from:保存了接收数据报的源地址。

? *fromlen:参数fromlen在调用recvfrom前为参数from的长度,调用recvfrom后将保存from的实际大小。

4>函数返回值:

执行成功后返回实际接收到数据的字节数,出错时则返回-1,错误代码存入errno中。

5>函数实例:

char recv_buf;

struct sockaddr_in addr_client;

int src_len;

src_len = sizeof(struct sockaddr_in);

int src_len;

src_len = sizeof(struct sockaddr_in);

if(recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(structsockaddr *)&src_addr,&src_len)

perror(“again_recvfrom”);

exit(1);

}

三.UDP编程实例

客户端向服务器发送字符串Hello tiger,服务器接收到数据后将接收到字符串发送回客户端。

1.服务器端程序

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 #include

9

10 #define SERV_PORT 3000

11

12 int main()

13 {

14 int sock_fd; //套接子描述符号

15 int recv_num;

16 int send_num;

17 int client_len;

18 char recv_buf;

19 struct sockaddr_in addr_serv;

20 struct sockaddr_in addr_client;//服务器和客户端地址

21 sock_fd = socket(AF_INET,SOCK_DGRAM,0);

22 if(sock_fd

23 perror(“socket”);

24 exit(1);

25 } else{

26

27 printf(“sock sucessful\n”);

28 }

29 //初始化服务器断地址

30 memset(&addr_serv,0,sizeof(struct sockaddr_in));

31 addr_serv.sin_family = AF_INET;//协议族

32 addr_serv.sin_port = htons(SERV_PORT);

33 addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);//任意本地址

34

35 client_len = sizeof(struct sockaddr_in);

36 /*绑定套接子*/

37 if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))

38 perror(“bind”);

39 exit(1);

40 } else{

41

42 printf(“bind sucess\n”);

43 }

44 while(1){

45 printf(“begin recv:\n”);

46 recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_client,&client_len);

47 if(recv_num

48 printf(“bad\n”);

49 perror(“again recvfrom”);

50 exit(1);

51 } else{

52 recv_buf=’\0′;

53 printf(“recv sucess:%s\n”,recv_buf);

54 }

55 printf(“begin send:\n”);

56 send_num = sendto(sock_fd,recv_buf,recv_num,0,(struct sockaddr *)&addr_client,client_len);

57 if(send_num

58 perror(“sendto”);

59 exit(1);

60 } else{

61 printf(“send sucessful\n”);

62 }

63 }

64 close(sock_fd);

65 return 0;

66 }

2.客户端程序

1 #include

2 #include

3 #include

4 #include

5 #include

6

7 #include

8 #include

9 #include

10

11 #define DEST_PORT 3000

12 #define DSET_IP_ADDRESS “192.168.1.103”

13

14 int main()

15 {

16 int sock_fd;/*套接字文件描述符*/

17 int send_num;

18 int recv_num;

19 int dest_len;

20 char send_buf={“hello tiger”};

21 char recv_buf;

22 struct sockaddr_in addr_serv;/*服务端地址,客户端地址*/

23

24 sock_fd = socket(AF_INET,SOCK_DGRAM,0);//创建套接子

25 //初始化服务器端地址

26 memset(&addr_serv,0,sizeof(addr_serv));

27 addr_serv.sin_family = AF_INET;

28 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);

29 addr_serv.sin_port = htons(DEST_PORT);

30

31 dest_len = sizeof(struct sockaddr_in);

32 printf(“begin send:\n”);

33 send_num = sendto(sock_fd,send_buf,sizeof(send_buf),0,(struct sockaddr *)&addr_serv,dest_len);

34 if(send_num

35 perror(“sendto”);

36 exit(1);

37 } else{

38

39 printf(“send sucessful:%s\n”,send_buf);

40 }

41 recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_serv,&dest_len);

42 if(recv_num

43

44 perror(“recv_from”);

45 exit(1);

46 } else{

47 printf(“recv sucessful\n”);

48 }

49 recv_buf=’\0′;

50 printf(“the receive:%s\n”,recv_buf);

51 close(sock_fd);

52 return 0;

WSAGetLastError()的返回值

6 – WSA_INVALID_HANDLE

指定的事件对象无效。若使用与Win32函数对应的Winsock函数,便有可能产生这样的Win32错误。它表明传递给WSAWaitForMultipleEvents的一个句柄是无效的。

8 – WSA_NOT_ENOUGH_MEMORY

内存不够。这个Win32错误指出内存数量不足,无法完成指定的操作。

87 – WSA_INVALID_PARAMETER

一个或多个参数无效。这个Win32错误表明传递到函数内部的参数无效。假若事件计数参数无效,那么在执行WSAWaitForMultipleEvents的时候,也会发生这样的错误。

258 – WSA_WAIT_TIMEOUT

操作超时。这个Win32错误指出重叠I/O操作未在规定的时间内完成。

995 – WSA_OPERATION_ABORTED

重叠操作被取消。这个Win32错误指出由于套接字的关闭,造成一次重叠I/O操作的取消。

除此以外,该错误也可能在执行SIO_FLUSH这个I/O控制命令时出现。

996 – WSA_IO_INCOMPLETE

重叠I/O事件对象未处于传信状态。这个Win32错误也和重叠I/O操作密切相关,在调用WSAGetOverlappedResults函数的时候产生,指出重叠I/O操作尚未完成。

997 – WSA_IO_PENDING

重叠操作将在以后完成。用Winsock函数发出一次重叠I/O操作时,若出现这样的Win32错误,便表明操作尚未完成,而且会在以后的某个时间完成。

WSAEINTR

函数调用中断。该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。

WSAEBADF

文件句柄错误。该错误表明提供的文件句柄无效。在MicrosoftWindowsCE下,socket函数可能返回这个错误,搜橡表明共享串口处于“忙”状态。

WSAEACCES

权限被拒。尝试对套接字进行操作,但被禁止。若试图在sendto或WSASendTo中使用一个广播地址,但是尚未用setsockopt和SO_BROADCAST这两个选项设置广播权限,便会产生这类错误。

WSAEFAULT

地运漏腊址无效。传给Winsock函数的指针地址无效。若指定的缓冲区太小,也会产生这个错误。

WSAEINVAL

参数无效。指定了一个无效参数。例如,假如为WSAIoctl调用指定了一个无效控制代码,便会产生这个错误。另外,它也可能表明套接字当前的状态有错,例如在一个没有监听的套接字上调用accept或WSAAccept的时候。

WSAEMFILE

打开文件过多。提示打开的套接字太多了。通常,Microsoft提供者只受到系统内可用资源数量的限制。

WSAEWOULDBLOCK

资源暂时不可用。对非阻塞套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。比如说,在一个非阻塞套接字上调用connect,就会返回这个错误。因为连接请求不能立即执行。

WSAEINPROGRESS

操作正在进行中。当前正在执行非锁定操作。一般来说不会出现这个错误,除非正在开发16位Winsock应用程序。

WSAEALREADY

操作已完成。一般来说,在非锁定套接字上尝试已处于进程中的操作时,会旁滑产生这个错误。比如,在一个已处于连接进程的非锁定套接字上,再一次调用connect或WSAConnect。

另外,服务提供者处于执行回调函数(针对支持回调例程的Winsock函数)的进程中时也会出现这个错误。

WSAENOTSOCK

无效套接字上的套接字操作。任何一个把SOCKET句柄当作参数的Winsock函数都会返回这个错误。它表明提供的套接字句柄无效。

WSAEDESTADDRREQ

需要目标地址。这个错误表明没有提供具体地址。比方说,假如在调用sendto时,将目标地址设为INADDR_ANY(任意地址),便会返回这个错误。

WSAEMSGSIZE

消息过长。这个错误的含义很多。如果在一个数据报套接字上发送一条消息,这条消息

对内部缓冲区而言太大的话,就会产生这个错误。再比如,由于网络自身的限制,使一条消息过长,也会产生这个错误。最后,如果收到数据报之后,缓冲区太小,不能接收消息时,也会产生这个错误。

WSAEPROTOTYPE

套接字协议类型有误。在socket或WSASocket调用中指定的协议不支持指定的套接字类型。

比如,要求建立SOCK_STREAM类型的一个IP套接字,同时指定协议为IPPROTO_UDP,便会产生这样的错误。

WSAENOPROTOOPT

协议选项错误。表明在getsockopt或setsockopt调用中,指定的套接字选项或级别不明、未获支持或者无效。

WSAEPROTONOSUPPORT

不支持的协议。系统中没有安装请求的协议或没有相应的实施方案。比如,如果系统中没有安装TCP/IP,而试着建立TCP或UDP套接字时,就会产生这个错误。

WSAESOCKTNOSUPPORT

不支持的套接字类型。对指定的地址家族来说,没有相应的具体套接字类型支持。比如,在向一个不支持原始套接字的协议请求建立一个SOCK_RAW套接字类型时,就会产生这个错误。

WSAEOPNOTSUPP

不支持的操作。表明针对指定的对象,试图采取的操作未获支持。通常,如果试着在一

个不支持调用Winsock函数的套接字上调用了Winsock时,就会产生这个错误。比如,在一个数据报套接字上调用accept或WSAAccept函数时,就会产生这样的错误。

WSAEPFNOSUPPORT

不支持的协议家族。请求的协议家族不存在,或系统内尚未安装。多数情况下,这个错误可与WSAEAFNOSUPPORT互换(两者等价);后者出现得更为频繁。

WSAEAFNOSUPPORT

地址家族不支持请求的操作。对套接字类型不支持的操作来说,在试着执行它时,就会出现这个错误。比如,在类型为SOCK_STREAM的一个套接字上调用sendto或WSASendTo函数时,就会产生这个错误。另外,在调用socket或WSASocket函数的时候,若同时请求了一个无效的地址家族、套接字类型及协议组合,也会产生这个错误。

WSAEADDRINUSE

下地址正在使用。正常情况下,每个套接字只允许使用一个套接字地址(例如,一个IP套接字地址由本地IP地址及端口号组成)。这个错误一般和bind、connect和WSAConnect这三个函数有关。可在setsockopt函数中设置套接字选项SO_REUSEADDR,允许多个套接字访问同一个本地IP地址及端口号。

WSAEADDRNOTAVAIL

不能分配请求的地址。API调用中指定的地址对那个函数来说无效时,就会产生这样的错误。例如,若在bind调用中指定一个IP地址,但却没有对应的本地IP接口,便会产生这样的错误。另外,通过connect、WSAConnect、sendto、WSASendTo和WSAJoinLeaf这四个函数为准备连接的远程计算机指定端口0时,也会产生这样的错误。

WSAENETDOWN

网络断开。试图采取一项操作时,却发现网络连接中断。这可能是由于网络堆栈的错误,网络接口的故障,或者本地网络的问题造成的。

WSAENETUNREACH

网络不可抵达。试图采取一项操作时,却发现目标网络不可抵达(不可访问)。这意味着本地主机不知道如何抵达一个远程主机。换言之,目前没有已知的路由可抵达那个目标主机。

WSAENETRESET

网络重设时断开了连接。由于“保持活动”操作检测到一个错误,造成网络连接的中断。

若在一个已经无效的连接之上,通过setsockopt函数设置SO_KEEPALIVE选项,也会出现这样的错误。

WSAECONNABORTED

软件造成连接取消。由于软件错误,造成一个已经建立的连接被取消。典型情况下,这意味着连接是由于协议或超时错误而被取消的。

WSAECONNRESET

连接被对方重设。一个已经建立的连接被远程主机强行关闭。若远程主机上的进程异常中止运行(由于内存冲突或硬件故障),或者针对套接字执行了一次强行关闭,便会产生这样的错误。针对强行关闭的情况,可用SO_LINGER套接字选项和setsockopt来配置一个套接字。

WSAENOBUFS

没有缓冲区空间。由于系统缺少足够的缓冲区空间,请求的操作不能执行。

WSAEISCONN

套接字已经连接。表明在一个已建立连接的套接字上,试图再建立一个连接。要注意的是,数据报和数据流套接字均有可能出现这样的错误。使用数据报套接字时,假如事先已通过connect或WSAConnect调用,为数据报通信关联了一个端点的地址,那么以后试图再次调用sendto或WSASendTo,便会产生这样的错误。

WSAENOTCONN

套接字尚未连接。若在一个尚未建立连接的“面向连接”套接字上发出数据收发请求,便会产生这样的错误。

WSAESHUTDOWN

套接字关闭后不能发送。表明已通过对shutdown的一次调用,部分关闭了套接字,但事后又请求进行数据的收发操作。要注意的是,这种错误只会在已经关闭的那个数据流动方向上才会发生。举个例子来说,完成数据发送后,若调用shutdown,那么以后任何数据发送调用都会产生这样的错误。

WSAETIMEDOUT

连接超时。若发出了一个连接请求,但经过规定的时间,远程计算机仍未作出正确的响应(或根本没有任何响应),便会发生这样的错误。要想收到这样的错误,通常需要先在套接字上设置好SO_SNDTIMEO和SO_RCVTIMEO选项,然后调用connect及WSAConnect函数。

要想了解在套接字上设置SO_SNDTIMEO和SO_RCVTIMEO选项的详情,可参考第9章。

WSAECONNREFUSED

连接被拒。由于被目标机器拒绝,连接无法建立。这通常是由于在远程机器上,没有任何应用程序可在那个地址之上,为连接提供服务。

WSAEHOSTDOWN

主机关闭。这个错误指出由于目标主机关闭,造成操作失败。然而,应用程序此时更有可能收到的是一条WSAETIMEDOUT(连接超时)错误,因为对方关机的情况通常是在试图建立一个连接的时候发生的。

WSAEHOSTUNREACH

没有到主机的路由。应用程序试图访问一个不可抵达的主机。该错误类似于WSAENETUNREACH。

WSAEPROCLIM

进程过多。有些Winsock服务提供者对能够同时访问它们的进程数量进行了限制。

WSASYSNOTREADY

网络子系统不可用。调用WSAStartup时,若提供者不能正常工作(由于提供服务的基层系统不可用),便会返回这种错误。

WSAVERNOTSUPPORTED

Winsock.dll版本有误。表明不支持请求的Winsock提供者版本。

WSANOTINITIALISED

Winsock尚未初始化。尚未成功完成对WSAStartup的一次调用。

WSAEDISCON

正在从容关闭。这个错误是由WSARecv和WSARecvFrom返回的,指出远程主机已初始化了一次从容关闭操作。该错误是在像ATM这样的“面向消息”协议上发生的。

WSAENOMORE

找不到更多的记录。这个错误自WSALookupServiceNext函数返回,指出已经没有留下更多的记录。这个错误通常可与WSA_E_NO_MORE互换使用。在应用程序中,应同时检查这个错误以及WSA_E_NO_MORE。

WSAECANCELLED

操作被取消。这个错误指出当WSALookupServiceNext调用仍在处理期间,发出了对WSALookupServiceEnd(服务中止)的一个调用。此时,WSALookupServiceNext便会返回这个错误。这个错误代码可与WSA_E_CANCELLED互换使用。作为应用程序,应同时检查这个错误以及WSA_E_CANCELLED

WSAEINVALIDPROVIDER

无效的服务提供者。这个错误同服务提供者关联在一起,在提供者不能建立正确的Winsock版本,从而无法正常工作的前提下产生。

WSAEPROVIDERFAILEDINIT

提供者初始化失败。这个错误同服务提供者关联在一起,通常见于提供者不能载入需要的DLL时。

WSASYSCALLFAILURE

系统调用失败。表明绝对不应失败的一个系统调用却令人遗憾地失败了。

WSASERVICE_NOT_FOUND

找不到这样的服务。这个错误通常与注册和名字解析函数相关,在查询服务时产生(第10章对这些函数进行了详尽解释)。该错误表明,在给定的名字空间内,找不到请求的服务。

WSATYPE_NOT_FOUND

找不到类的类型。该错误也与注册及名字解析函数关联在一起,在处理服务类(Service Class)时发生。若注册好一个服务的实例,它必须引用一个以前通过WSAInstallServiceClass安装好的服务。

WSA_E_NO_MORE

找不到更多的记录。这个错误是自WSALookupServiceNext调用返回的,指出已经没有剩

下的记录。该错误通常可与WSAENOMORE互换使用。作为一个应用程序,应同时检查这个

错误以及WSAENOMORE。

WSA_E_CANCELLED

操作被取消。该错误指出在对WSALookupServiceNext的调用尚未完成的时候,又发出了对WSALookupServiceEnd(中止服务)的一个调用。这样,WSALookupServiceNext就会返回该错误。这个错误代码可与WSAECANCELLED互换使用。作为一个应用程序,应同时检查这个错误以及WSAECANCELLED。

WSAEREFUSED

查询被拒。由于被主动拒绝,所以一个数据库查询操作失败。

WSAHOST_NOT_FOUND

主机没有找到。这个错误是在调用gethostbyname和gethostbyaddr时产生的,表明没有找到一个授权应答主机(AuthoritativeAnswerHost)。

WSATRY_AGAIN

非授权主机没有找到。这个错误也是在调用gethostbyname和gethostbyaddr时产生的,表明没有找到一个非授权主机,或者遇到了服务器故障。

WSANO_RECOVERY

遇到一个不可恢复的错误。这个错误也是在调用gethostbyname和gethostbyaddr时产生的,指出遇到一个不可恢复的错误,应再次尝试操作。

WSANO_DATA

没有找到请求类型的数据记录。这个错误也是在调用gethostbyname和gethostbyaddr时产生的,指出尽管提供的名字有效,但却没有找到与请求类型对应的数据记录。

WSA_QOS_RECEIVERS

至少有一条预约消息抵达。这个值同IP服务质量(QoS)有着密切的关系,其实并不是一个真正的“错误”(QoS的详情见第12章)。它指出网络上至少有一个进程希望接收QoS通信。

WSA_QOS_SENDERS

至少有一条路径消息抵达。这个值同QoS关联在一起,其实更像一种状态报告消息。它指出在网络上,至少有一个进程希望进行QoS数据的发送。

WSA_QOS_NO_SENDERS

没有QoS发送者。这个值同QoS关联在一起,指出不再有任何进程对QoS数据的发送有兴趣。请参阅第12章,了解在发生这样的错误时,对所发生情况的一系列完整说明。

WSA_QOS_NO_RECEIVERS

没有QoS接收者。这个值同QoS关联在一起,指出不再有任何进程对QoS数据的接收有兴趣。请参阅第12章,查阅对这个错误的完整说明。

WSA_QOS_REQUEST_CONFIRMED

预约请求已被确认。QoS应用可事先发出请求,希望在批准了自己对网络带宽的预约请求后,收到通知。若发出了这样的请求,一旦批准,便会收到这样的消息。请参阅第12章,了解对此消息的详细说明。

WSA_QOS_ADMISSION_FAILURE

缺乏资源致错。资源不够,以至于无法满足QoS带宽请求。

WSA_QOS_POLICY_FAILURE

证书无效。表明发出QoS预约请求的时候,要么用户并不具备正确的权限,要么提供的证书无效。

WSA_QOS_BAD_STYLE

未知或冲突的样式。QoS应用程序可针对一个指定的会话,建立不同的过滤器样式。若出现这一错误,表明指定的样式类型要么未知,要么存在冲突。请参阅第12章,了解对过滤器样式的详细说明。

WSA_QOS_BAD_OBJECT

无效的FILTERSPEC结构或者提供者特有对象。假如为QoS对象提供的FILTERSPEC结构无效,或者提供者特有的缓冲区无效,便会返回这样的错误,详见第12章。

WSA_QOS_TRAFFIC_CTRL_ERROR

FLOWSPEC有问题。假如通信控制组件发现指定的FLOWSPEC参数存在问题(作为QoS对象的一个成员传递),便会返回这样的错误。

WSA_QOS_GENERIC_ERROR

常规QoS错误。这是一个比较泛泛的错误;假如其他QoS错误都不适合,便返回这个错误。

关于linux下udp的问题…

很想帮你但力不从心啊。顶

首先:udp是不需要accept的,因为他不是连接的,不需要accept;

也就衫尘宏是说你在bind好了过后就直接while(1)就可以了。

这个里面用的函数有些变化,发送用 sendto, 接收用 recvfrom

这两个函数你可以直接在终端下面输入: man sendto 以及 man recvfrom查看他们或册的参数以及返兄和回值问题。

ps:在Linux下面编程要多看看它的函数:

这其中就包括了Linux下面常用的c函数, 你可以去看看

linux sendto 返回值的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux sendto 返回值,解读linux sendto函数的返回值,基于Linux的远程指令系统(使用udp而不是tcp),WSAGetLastError()的返回值,关于linux下udp的问题…的信息别忘了在本站进行查找喔。


数据运维技术 » 解读linux sendto函数的返回值 (linux sendto 返回值)