Linux常用C函数-接口处理篇(网络通信函数)

接口处理篇
accept,
bind,
connect,
endprotoent,
endservent,
getsockopt,
htonl,
htons,
inet_addr,
inet_aton,
inet_ntoa,
listen,
ntohl,
ntohs,
recv,
recvfrom,
recvmsg,
send,
sendmsg,
sendto,
setprotoent,
setservent,
setsockopt,
shutdown,
socket,

accept(接受socket连线)
相关函数
socket,bind,listen,connect
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int accept(int s,struct sockaddr * addr,int * addrlen);
函数说明
accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构sockaddr的定义请参考bind()。
返回值
成功则返回新的socket处理代码,失败返回-1,错误原因存于errno中。
错误代码
EBADF 参数s 非合法socket处理代码。
EFAULT 参数addr指针指向无法存取的内存空间。
ENOTSOCK 参数s为一文件描述词,非socket。
EOPNOTSUPP 指定的socket并非SOCK_STREAM。
EPERM 防火墙拒绝此连线。
ENOBUFS 系统的缓冲内存不足。
ENOMEM 核心内存不足。
范例
参考listen()。
 

 

bind(对socket定位)
相关函数
socket,accept,connect,listen
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int bind(int sockfd,struct sockaddr * my_addr,int addrlen);
函数说明
bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket domain定义了一个通用的数据结构
struct sockaddr
{
unsigned short int sa_family;
char sa_data[14];
};
sa_family 为调用socket()时的domain参数,即AF_xxxx值。
sa_data 最多使用14个字符长度。
此sockaddr结构会因使用不同的socket domain而有不同结构定义,例如使用AF_INET domain,其socketaddr结构定义便为
struct socketaddr_in
{
unsigned short int sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
struct in_addr
{
uint32_t s_addr;
};
sin_family 即为sa_family
sin_port 为使用的port编号
sin_addr.s_addr 为IP 地址
sin_zero 未使用。
参数
addrlen为sockaddr的结构长度。
返回值
成功则返回0,失败返回-1,错误原因存于errno中。
错误代码
EBADF 参数sockfd 非合法socket处理代码。
EACCESS 权限不足
ENOTSOCK 参数sockfd为一文件描述词,非socket。
范例
参考listen()
 

 

connect(建立socket连线)
相关函数
socket,bind,listen
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
函数说明
connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。
返回值
成功则返回0,失败返回-1,错误原因存于errno中。
错误代码
EBADF 参数sockfd 非合法socket处理代码
EFAULT 参数serv_addr指针指向无法存取的内存空间
ENOTSOCK 参数sockfd为一文件描述词,非socket。
EISCONN 参数sockfd的socket已是连线状态
ECONNREFUSED 连线要求被server端拒绝。
ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。
ENETUNREACH 无法传送数据包至指定的主机。
EAFNOSUPPORT sockaddr结构的sa_family不正确。
EALREADY socket为不可阻断且先前的连线操作还未完成。
范例

#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 1234
#define SERVER_IP “127.0.0.1”
main()
{
int s;
struct sockaddr_in addr;
char buffer[256];
if((s = socket(AF_INET,SOCK_STREAM,0))<0){
perror(“socket”);
exit(1);
}

bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);

if(connect(s,&addr,sizeof(addr))<0){
perror(“connect”);
exit(1);
}

recv(s,buffer,sizeof(buffer),0);
printf(“%s\n”,buffer);
while(1){
bzero(buffer,sizeof(buffer));

read(STDIN_FILENO,buffer,sizeof(buffer));

if(send(s,buffer,sizeof(buffer),0)<0){
perror(“send”);
exit(1);
}
}
}
执行
$ ./connect
Welcome to server!
hi I am client!

 

 

endprotoent(结束网络协议数据的读取)
相关函数
getprotoent,getprotobyname,getprotobynumber,setprotoent
表头文件
#include<netdb.h>
定义函数
void endprotoent(void);
函数说明
endprotoent()用来关闭由getprotoent()打开的文件。
返回值
 
范例
参考getprotoent()
 

 

endservent(结束网络服务数据的读取)
相关函数
getservent,getservbyname,getservbyport,setservent
表头文件
#include<netdb.h>
定义函数
void endservent(void);
函数说明
endservent()用来关闭由getservent()所打开的文件。
返回值
 
范例
参考getservent()。
 

 

getsockopt(取得socket状态)
相关函数
setsockopt
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen);
函数说明
getsockopt()会将参数s所指定的socket状态返回。参数optname代表欲取得何种选项状态,而参数optval则指向欲保存结果的内存地址,参数optlen则为该空间的大小。参数level、optname请参考setsockopt()。
返回值
成功则返回0,若有错误则返回-1,错误原因存于errno
错误代码
EBADF 参数s 并非合法的socket处理代码
ENOTSOCK 参数s为一文件描述词,非socket
ENOPROTOOPT 参数optname指定的选项不正确
EFAULT 参数optval指针指向无法存取的内存空间
范例
#include<sys/types.h>
#include<sys/socket.h>
main()
{
int s,optval,optlen = sizeof(int);
if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”);
getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen);
printf(“optval = %d\n”,optval);
close(s);}
执行
optval = 1
 

 

htonl(将32位主机字符顺序转换成网络字符顺序)
相关函数
htons,ntohl,ntohs
表头文件
#include<netinet/in.h>
定义函数
unsigned long int htonl(unsigned long int hostlong);
函数说明
htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。
返回值
返回对应的网络字符顺序。
范例
参考getservbyport()或connect()。
 

 

htons(将16位主机字符顺序转换成网络字符顺序)
相关函数
htonl,ntohl,ntohs
表头文件
#include<netinet/in.h>
定义函数
unsigned short int htons(unsigned short int hostshort);
函数说明
htons()用来将参数指定的16位hostshort转换成网络字符顺序。
返回值
返回对应的网络字符顺序。
范例
参考connect()。
 

 

inet_addr(将网络地址转成二进制的数字)
相关函数
inet_aton,inet_ntoa
表头文件
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定义函数
unsigned long int inet_addr(const char *cp);
函数说明
inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例如:“163.13.132.68”。
返回值
成功则返回对应的网络二进制的数字,失败返回-1。
 

 

inet_aton(将网络地址转成网络二进制的数字)
相关函数
inet_addr,inet_ntoa
表头文件
#include<sys/scoket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定义函数
int inet_aton(const char * cp,struct in_addr *inp);
函数说明
inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,然后存于参数inp所指的in_addr结构中。
结构in_addr定义如下
struct in_addr
{
unsigned long int s_addr;
};
返回值
成功则返回非0值,失败则返回0。
 

 

inet_ntoa(将网络二进制的数字转换成网络地址)
相关函数
inet_addr,inet_aton
表头文件
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定义函数
char * inet_ntoa(struct in_addr in);
函数说明
inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。
返回值
成功则返回字符串指针,失败则返回NULL。
 

 

listen(等待连接)
相关函数
socket,bind,accept,connect
表头文件
#include<sys/socket.h>
定义函数
int listen(int s,int backlog);
函数说明
listen()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。
返回值
成功则返回0,失败返回-1,错误原因存于errno
附加说明
listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socket为AF_INET则参数backlog 最大值可设至128。
错误代码
EBADF 参数sockfd非合法socket处理代码
EACCESS 权限不足
EOPNOTSUPP 指定的socket并未支援listen模式。
范例
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 1234
#define MAXSOCKFD 10
main()
{
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
fd_set readfds;
char buffer[256];
char msg[ ] =”Welcome to server!”;
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){
perror(“socket”);
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family =AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,&addr,sizeof(addr))<0){
perror(“connect”);
exit(1);
}
if(listen(sockfd,3)<0){
perror(“listen”);
exit(1);
}
for(fd=0;fd<MAXSOCKFD;fd++)
is_connected[fd]=0;
while(1){
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
for(fd=0;fd<MAXSOCKFD;fd++)
if(is_connected[fd]) FD_SET(fd,&readfds);
if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue;
for(fd=0;fd<MAXSOCKFD;fd++)
if(FD_ISSET(fd,&readfds)){
if(sockfd = =fd){
if((newsockfd = accept (sockfd,&addr,&addr_len))<0)
perror(“accept”);
write(newsockfd,msg,sizeof(msg));
is_connected[newsockfd] =1;
printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr));
}else{
bzero(buffer,sizeof(buffer));
if(read(fd,buffer,sizeof(buffer))<=0){
printf(“connect closed.\n”);
is_connected[fd]=0;
close(fd);
}else
printf(“%s”,buffer);
}
}
}
}
执行
$ ./listen
connect from 127.0.0.1
hi I am client
connected closed.
 

 

ntohl(将32位网络字符顺序转换成主机字符顺序)
相关函数
htonl,htons,ntohs
表头文件
#include<netinet/in.h>
定义函数
unsigned long int ntohl(unsigned long int netlong);
函数说明
ntohl()用来将参数指定的32位netlong转换成主机字符顺序。
返回值
返回对应的主机字符顺序。
范例
参考getservent()。
 

 

ntohs(将16位网络字符顺序转换成主机字符顺序)
相关函数
htonl,htons,ntohl
表头文件
#include<netinet/in.h>
定义函数
unsigned short int ntohs(unsigned short int netshort);
函数说明
ntohs()用来将参数指定的16位netshort转换成主机字符顺序。
返回值
返回对应的主机顺序。
范例
参考getservent()。
 

 

recv(经socket接收数据)
相关函数
recvfrom,recvmsg,send,sendto,socket
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int recv(int s,void *buf,int len,unsigned int flags);
函数说明
recv()用来接收远端主机经指定的socket传来的数据,并把数据存到由参数buf 指向的内存空间,参数len为可接收数据的最大长度。
参数
flags一般设0。其他数值定义如下:
MSG_OOB 接收以out-of-band 送出的数据。
MSG_PEEK 返回来的数据并不会在系统内删除,如果再调用recv()会返回相同的数据内容。
MSG_WAITALL强迫接收到len大小的数据后才能返回,除非有错误或信号产生。
MSG_NOSIGNAL此操作不愿被SIGPIPE信号中断返回值成功则返回接收到的字符数,失败返回-1,错误原因存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码
EFAULT 参数中有一指针指向无法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断
EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断
ENOBUFS 系统的缓冲内存不足。
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
范例
参考listen()。
 

 

recvfrom(经socket接收数据)
相关函数
recv,recvmsg,send,sendto,socket
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);
函数说明
recv()用来接收远程主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度。参数flags 一般设0,其他数值定义请参考recv()。参数from用来指定欲传送的网络地址,结构sockaddr 请参考bind()。参数fromlen为sockaddr的结构长度。
返回值
成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码
EFAULT 参数中有一指针指向无法存取的内存空间。
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
范例

#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/typs.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 2345
#define SERVER_IP “127.0.0.1”
main()
{
int s,len;
struct sockaddr_in addr;
int addr_len =sizeof(struct sockaddr_in);
char buffer[256];

if((s = socket(AF_INET,SOCK_DGRAM,0))<0){
perror(“socket”);
exit(1);
}

bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
while(1){
bzero(buffer,sizeof(buffer));

len =read(STDIN_FILENO,buffer,sizeof(buffer));

sendto(s,buffer,len,0,&addr,addr_len);

len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);
printf(“receive: %s”,buffer);
}
}
执行
(先执行udp server 再执行udp client)
hello
receive: hello
 

 

recvmsg(经socket接收数据)
相关函数
recv,recvfrom,send,sendto,sendmsg,socket
表头文件
#include<sys/types.h>
#include<sys/socktet.h>
定义函数
int recvmsg(int s,struct msghdr *msg,unsigned int flags);
函数说明
recvmsg()用来接收远程主机经指定的socket传来的数据。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据结构内容,参数flags一般设0,详细描述请参考send()。关于结构msghdr的定义请参考sendmsg()。
返回值
成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
范例
参考recvfrom()。
 

 

send(经socket传送数据)
相关函数
sendto,sendmsg,recv,recvfrom,socket
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int send(int s,const void * msg,int len,unsigned int falgs);
函数说明
send()用来将数据由指定的socket 传给对方主机。参数s为已建立好连接的socket。参数msg指向欲连线的数据内容,参数len则为数据长度。参数flags一般设0,其他数值定义如下
MSG_OOB 传送的数据以out-of-band 送出。
MSG_DONTROUTE 取消路由表查询
MSG_DONTWAIT 设置为不可阻断运作
MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断。
返回值
成功则返回实际传送出去的字符数,失败返回-1。错误原因存于errno
错误代码
EBADF 参数s 非合法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
范例
参考connect()
 

 

sendmsg(经socket传送数据)
相关函数
send,sendto,recv,recvfrom,recvmsg,socket
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);
函数说明
sendmsg()用来将数据由指定的socket传给对方主机。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg 指向欲连线的数据结构内容,参数flags一般默认为0,详细描述请参考send()。
结构msghdr定义如下
struct msghdr
{
void *msg_name;
socklen_t msg_namelen;
strcut iovec * msg_iov;
size_t msg_iovlen;
void * msg_control;
size_t msg_controllen;
int msg_flags;
};
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno
错误代码
EBADF 参数s 非合法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
范例
参考sendto()。
 

 

sendto(经socket传送数据)
相关函数
send , sendmsg,recv , recvfrom , socket
表头文件
#include < sys/types.h >
#include < sys/socket.h >
定义函数
int sendto ( int s , const void * msg, int len, unsigned int flags, const 
struct sockaddr * to , int tolen ) ;
函数说明
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结果长度。
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。
错误代码
EBADF 参数s非法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间。
WNOTSOCK canshu s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。
ENOBUFS 系统的缓冲内存不足。
EINVAL 传给系统调用的参数不正确。
范例
#include < sys/types.h >
#include < sys/socket.h >
# include <netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345
main(){
int sockfd,len;
struct sockaddr_in addr;
char buffer[256];

if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){
perror (“socket”);
exit(1);
}

bzero ( &addr, sizeof(addr) );
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr=hton1(INADDR_ANY) ;
if (bind(sockfd, &addr, sizeof(addr))<0){
perror(“connect”);
exit(1);
}
while(1){
bezro(buffer,sizeof(buffer));
len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len);

printf(“receive from %s\n “ , inet_ntoa( addr.sin_addr));

sendto(sockfd,buffer,len,0,&addr,addr_len);”
}
}
执行
请参考recvfrom()
 

 

setprotoent(打开网络协议的数据文件)
相关函数
getprotobyname, getprotobynumber, endprotoent
表头文件
#include <netdb.h>
定义函数
void setprotoent (int stayopen);
函数说明
setprotoent()用来打开/etc/protocols, 如果参数stayopen值为1,则接下来的getprotobyname()或getprotobynumber()将不会自动关闭此文件。
 

 

setservent(打开主机网络服务的数据文件)
相关函数
getservent, getservbyname, getservbyport, endservent
表头文件
#include < netdb.h >
定义函数
void setservent (int stayopen);
函数说明
setservent()用来打开/etc/services,如果参数stayopen值为1,则接下来的getservbyname()或getservbyport()将补回自动关闭文件。
 

 

setsockopt(设置socket状态)
相关函数
getsockopt
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen);
函数说明
setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值:
SO_DEBUG 打开或关闭排错模式
SO_REUSEADDR 允许在bind()过程中本地地址可重复使用
SO_TYPE 返回socket形态。
SO_ERROR 返回socket已发生的错误原因
SO_DONTROUTE 送出的数据包不要利用路由设备来传输。
SO_BROADCAST 使用广播方式传送
SO_SNDBUF 设置送出的暂存区大小
SO_RCVBUF 设置接收的暂存区大小
SO_KEEPALIVE 定期确定连线是否已终止。
SO_OOBINLINE 当接收到OOB 数据时会马上送至标准输入设备
SO_LINGER 确保数据安全且可靠的传送出去。
参数
optval代表欲设置的值,参数optlen则为optval的长度。
返回值
成功则返回0,若有错误则返回-1,错误原因存于errno。
附加说明
EBADF 参数s并非合法的socket处理代码
ENOTSOCK 参数s为一文件描述词,非socket
ENOPROTOOPT 参数optname指定的选项不正确。
EFAULT 参数optval指针指向无法存取的内存空间。
范例
参考getsockopt()。
 

 

shutdown(终止socket通信)
相关函数
socket,connect
表头文件
#include<sys/socket.h>
定义函数
int shutdown(int s,int how);
函数说明
shutdown()用来终止参数s所指定的socket连线。参数s是连线中的socket处理代码,参数how有下列几种情况:
how=0 终止读取操作。
how=1 终止传送操作
how=2 终止读取及传送操作
返回值
成功则返回0,失败返回-1,错误原因存于errno。
错误代码
EBADF 参数s不是有效的socket处理代码
ENOTSOCK 参数s为一文件描述词,非socket
ENOTCONN 参数s指定的socket并未连线
 

 

socket(建立一个socket通信)
相关函数
accept,bind,connect,listen
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int socket(int domain,int type,int protocol);
函数说明
socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。参数domain 指定使用何种的地址类型,完整的定义在/usr/include/bits/socket.h 内,底下是常见的协议:
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通信协议
PF_INET?AF_INET Ipv4网络协议
PF_INET6/AF_INET6 Ipv6 网络协议
PF_IPX/AF_IPX IPX-Novell协议
PF_NETLINK/AF_NETLINK 核心用户接口装置
PF_X25/AF_X25 ITU-T X.25/ISO-8208 协议
PF_AX25/AF_AX25 业余无线AX.25协议
PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCs
PF_APPLETALK/AF_APPLETALK appletalk(DDP)协议
PF_PACKET/AF_PACKET 初级封包接口
参数
type有下列几种数值:
SOCK_STREAM 提供双向连续且可信赖的数据流,即TCP。支持
OOB 机制,在所有数据传送前必须使用connect()来建立连线状态。
SOCK_DGRAM 使用不连续不可信赖的数据包连接
SOCK_SEQPACKET 提供连续可信赖的数据包连接
SOCK_RAW 提供原始网络协议存取
SOCK_RDM 提供可信赖的数据包连接
SOCK_PACKET 提供和网络驱动程序直接通信。
protocol用来指定socket所使用的传输协议编号,通常此参考不用管它,设为0即可。
返回值
成功则返回socket处理代码,失败返回-1。
错误代码
EPROTONOSUPPORT 参数domain指定的类型不支持参数type或protocol指定的协议
ENFILE 核心内存不足,无法建立新的socket结构
EMFILE 进程文件表溢出,无法再建立新的socket
EACCESS 权限不足,无法建立type或protocol指定的协议
ENOBUFS/ENOMEM 内存不足
EINVAL 参数domain/type/protocol不合法
范例
参考connect()。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 5108

//题意是给一个数N,然后让你求M,使得N/M为素数,并且M的值最小//思路呢,大概有两种,一个是遍历素数求解的,不过数据太大不现实//另外一种就是质因数求解,for循环是遍历质因数,然后while循环是剔除相同的质因数//最后你可以判定剩下来的如果非1,则是最大素数....#include <ios…

跟随大数据旅行

2019独角兽企业重金招聘Python工程师标准>>> 跟随大数据旅行 这是一本短小而精悍的书&#xff0c;不需要花费太多时间就能够让读者弄清 楚大数据到底是什么&#xff0c;还能帮助读者了解大数据的来龙去脉以及未来大 数据对各行各业带来的影响与作用。大数据将带来新…

利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...

本文将会以插入排序为例&#xff0c;介绍算法与数据结构的基础部分。插入排序排序可以说是整个算法中最为基础&#xff0c;最为重要的一部分&#xff0c;而插入排序正是排序算法中最简单的一种解决办法。什么是排序问题&#xff1f;输入&#xff1a;n个数的一个序列 。输出&…

MD5计算,一个扩展类,哪里都能用

最近有同学问到如何计算一个字节数组的MD5值&#xff0c;现在分享一个扩展类&#xff0c;有了它&#xff0c;MD5计算再也不用其他了。先看示例&#xff1a;string s "hello world";var s_md5 s.ToMD5();string f "C:\Windows\explorer.exe";var f_md5 f…

字符串之翻转字符串

题目: 给定一个字符类型的数组chas,请在单词间做逆序调整,只要做到单词顺序即可,对空格的位置没有特别要求。 例如: 如果把chas看作字符串为“dog loves pig”,调整成“pig loves dog”. 如果把chas看作字符串为“Im a student.”,调整成“student. a Im”. 代码: pac…

noi 4982 踩方格

题目链接&#xff1a;http://noi.openjudge.cn/ch0206/4982/ 深搜很好写。 DP&#xff1a;O(n) d[i] 为走 I 不的方案数&#xff0c; l[i],r[i],u[i]为第一步走 左&#xff0c;右&#xff0c;上&#xff0c;共走 i 步的方案数。(u[i] d[i-1]) d[i] l[i] r[i] u[i] l[i-1] …

VB6之GIF分解

原文链接&#xff1a;http://hi.baidu.com/coo_boi/item/1264a64172fe8dec1f19bc08 还是找了个C的翻译下&#xff0c;原文链接&#xff1a;http://www.360doc.com/content/05/1122/15/1894_34348.shtml GDI的函数声明 我就不放上了&#xff0c;网上有个做好的GDI公共模块。 Pri…

MindFusion Pack for ASP.NET发布v2013.R2

在MindFusion.Diagramming for WebForms中&#xff1a;导入OpenOffice Draw文件新的DrawImporter类允许你通过OpenOffice Draw Vector图形编辑器导入后缀为*.odg的文件。只需添加一个引用到MindFusion.Diagramming.Import.Draw.dll组即可。你还可以使用导入法的多种重载将OpenO…

python中的常量可以修改吗_python实现不可修改的常量

因为种种原因&#xff0c;Python并未提供如C/C/Java一样的const修饰符&#xff0c;换言之&#xff0c;python中没有常量&#xff0c;至少截止2015年年末&#xff0c;还没有这个打算。Python程序一般通过约定俗成的变量名全大写的形式来表示这是一个常量&#xff0c;但是这终究不…

字符串之数组中两个字符串的最小距离

题目: 给定一个字符串数组strs, 再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1和str2为null,或者不再strs中,都返回-1 列如: strs = {"1","3","3","2","3","1","3"} ,…

【翻译】C#表达式中的动态查询

当您使用LINQ来处理数据库时&#xff0c;这种体验是一种神奇的体验&#xff0c;对吗&#xff1f;你把数据库实体像一个普通的收集&#xff0c;使用Linq中像Where&#xff0c;Select或者 Take&#xff0c;这些简单的使用就能让代码可用了。但是&#xff0c;让我们考虑一下这里是…

SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高

1.背景知识 在讲SVD之前&#xff0c;我还是想先回到基于物品相似的协同过滤算法。这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐。其公式为&#xff1a; 其中 rui 表示预测用户u对物品i的喜爱程度。wij 是物品i&#xff0c;j之间的相似度&#xf…

资源文件(.RES)的应用

资源档有什麽用处呢&#xff1f;最重要的有两个地方1.国际发行&#xff1a;我们将Application中所有的文字从Resource用读取&#xff0c;那麽&#xff0c;只要更动 Resource档的内容&#xff0c;就可以用不同语言的方式来显示。2.管理资源&#xff1a;例如说&#x…

Linux下Tomcat设置自动启动

在linux系统下&#xff0c;设置某个服务自启动的话&#xff0c;需要在/etc/rcX.d下挂载&#xff0c;还要在/etc/init.d/下写启动脚本的。 1、我们在/etc/init.d/下新建一个文件tomcat&#xff08;需要在root权限下操作&#xff09; vi /etc/init.d/tomcat#!/bin/sh # chkconfig…

Android插件化开发之动态加载的类型

https://segmentfault.com/a/1190000005113493 基本信息 Author&#xff1a;kaedea GitHub&#xff1a;android-dynamical-loading 现在网络上有许多关于动态加载的介绍的文章&#xff0c;谈及的关键词汇有动态加载、插件化、热部署、热修复等&#xff0c;对于一些刚接触这方…

c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分

背景最近NBA总决赛吸引了不少球迷&#xff0c;但是因为时差的关系&#xff0c;人家在比赛&#xff0c;我们在上班&#xff0c;有时候上班又不好意思光明正大的看比赛&#xff0c;那有什么办法 可以光明正大的看又不被发现呢。有&#xff0c;自己动手丰衣足食&#xff0c;Chrome…

Codevs2157 配对

题目描述 Description给出2个序列A{a[1]&#xff0c;a[2]&#xff0c;…&#xff0c;a[n]}&#xff0c;B{b[1]&#xff0c;b[2]&#xff0c;…&#xff0c;b[n]}&#xff0c;从A、B中各选出n个元素进行一一配对&#xff08;可以不按照原来在序列中的顺序&#xff09;&#xff0…

UITableView的优化原理

2019独角兽企业重金招聘Python工程师标准>>> 当我们下啦一个 UITableView时&#xff0c;如果没有做优化&#xff0c;只是简单的实现功能代码如下&#xff0c;这样当我们有上百条tableviewcell的时候&#xff0c;我们滑动的非常快时会非常费内存&#xff0c;当然苹果…