Linux常用C函数-接口处理篇 zhuan

网络编程第一:IP地址结构sin_addr的定义解析。 <br />IP地址结构:<br />   struct   in_addr {<br />                     union {<br />                            struct {<br />                                        unsigned  char s_b1, <br />                                                                s_b 阅读详情
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为不可阻断且先前的连线操作还未完成。

范例  /* 利用socket的TCP client
此程序会连线TCP server,并将键盘输入的字符串传送给server。
TCP server范例请参考listen()。
*/
#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);
}
/* 填写sockaddr_in结构*/
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);
}
/* 接收由server端传来的信息*/
recv(s,buffer,sizeof(buffer),0);
printf(“%s/n”,buffer);
while(1){
bzero(buffer,sizeof(buffer));
/* 从标准输入设备取得字符串*/
read(STDIN_FILENO,buffer,sizeof(buffer));
/* 将字符串传给server端*/
if(send(s,buffer,sizeof(buffer),0)<0){
perror(“send”);
exit(1);
}
}
}

执行  $ ./connect
Welcome to server!
hi I am client! /*键盘输入*/
/*<Ctrl+C>中断程序*/

 




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 /*SOCK_STREAM的定义正是此值*/

 




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 传给系统调用的参数不正确。

范例  /*利用socket的UDP client
此程序会连线UDP server,并将键盘输入的字符串传给server。
UDP server 范例请参考sendto()。
*/
#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];
/* 建立socket*/
if((s = socket(AF_INET,SOCK_DGRAM,0))<0){
perror(“socket”);
exit(1);
}
/* 填写sockaddr_in*/
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));
/* 将字符串传送给server端*/
sendto(s,buffer,len,0,&addr,addr_len);
/* 接收server端返回的字符串*/
len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);
printf(“receive: %s”,buffer);
}
}

执行  (先执行udp server 再执行udp client)
hello /*从键盘输入字符串*/
receive: hello /*server端返回来的字符串*/

 




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; /*Address to send to /receive from . */
socklen_t msg_namelen; /* Length of addres data */
strcut iovec * msg_iov; /* Vector of data to send/receive into */
size_t msg_iovlen; /* Number of elements in the vector */
void * msg_control; /* Ancillary dat */
size_t msg_controllen; /* Ancillary data buffer length */
int msg_flags; /* Flags on received message */
};

返回值  成功则返回实际传送出去的字符数,失败返回-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 /*使用的port*/
main(){
int sockfd,len;
struct sockaddr_in addr;
char buffer[256];
/*建立socket*/
if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){
perror (“socket”);
exit(1);
}
/*填写sockaddr_in 结构*/
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);
/*显示client端的网络地址*/
printf(“receive from %s/n “ , inet_ntoa( addr.sin_addr));
/*将字串返回给client端*/
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()。
IP地址本地字节序与网络字节序的转换函数 IP地址本地字节序的转换函数有以下几种: 1、uint32_t htonl(uint32_t hostlong); //一般不用来转换ip地址 这个函数是int转int型,而我们习惯用的ip的是点分十进制的字符串。 用起来不方便,所以,此函数多数用来将32位(4字节整型)进行字节序转换。 ps: INADDR_ANY,当不指定ip地址时,可以直接用该宏定义,最简单。 addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取当前网卡的有效ip地址 2、in. 阅读详情

相关推荐

【C语言】Linux内核accept 系统调用代码

它接收四个参数:文件描述符`fd`、用户空间的指向`sockaddr`结构的指针`upeer_sockaddr`、指向地址长度变量的指针`upeer_addrlen`、以及标志位`flags`。- 如果`flags`指定了非阻塞标志`SOCK_NONBLOCK`,并且这个标志和系统定义的`O_NONBLOCK`不相同,则将`flags`中的`SOCK_NONBLOCK`标志替换成`O_NONBLOCK`。4. 获取一个未使用的文件描述符`newfd`,分配并初始化一个新的文件对象`newfile`。

数字人生 1379

网络编程基础

字节序: 主机字节序: 主机内部内存存储数据的方式 a的主机字节序--->网络字节序--->b的主机字节序 网络字节序固定为大端 小端字节序:低位存在低字节 字节序转换函数: htons(),htonl(),ntohs(),ntohl() h:host n:network s:short,16位(如端口号) l:long,32位(如IPv4地址) inet_pton: inet_pton(); 套接字类型: SOCK_STREAM,SOZK_DGRAM,... l

m0_60274660的博客 2802

高速接口电平标准互连设计:LVPECL、PECL与LVDS的实战解析

本文深入解析了LVPECL、PECL与LVDS三种高速接口电平标准的互连设计实战。针对信号共模电压、阻抗匹配等核心差异,详细对比了直流耦合与交流耦合两种主流方案,并提供了电阻网络计算、布局布线要点及光模块等特殊场景下的选型建议,帮助工程师解决高速信号间的“翻译”难题,确保信号完整性。

weixin_29198045的博客 483

网络编程中如何设置服务器监听IP

在使用socket编写服务器程序时,设置

张海涛的专栏 5673

zhuan linux dll

LINUX动态链接库高级应用在《LINUX下动态链接库的创建与应用》一文中,我介绍了LINUX动态链接库的基本知识.其要点是:用户根据实际情况需要,利用dlopen,dlsym,dlclose等动态链接库操作函数,装入指定的动态链接库中指定的函数,然后加以执行.程序中使用很少的动态函数时,这样的做法尚可.如果程序需要调用大量的动态函数,那么采用这样的编程手段将是非常繁复的,所以我们必...

abc1104332737的博客 112

Linux 内核中的 GCC 特性[zhuan]

文档选项<trvalign="top"><img alt="" height="1" width="8"src="//www.ibm.com/i/c.gif"/><img alt="" width="16"height="16" src="//www.ibm.com/i/c.gif"/><td class="small"

tianqio的专栏 999

获得Unix/Linux系统中的IP、MAC地址等信息[zhuan]

实际环境和特殊需求往往会将简单问题复杂化,比如计算机IP地址,对于一个连接中socket,可以直接获得本端和对端的IP、端口信息。但在一些特殊场合我们可能需要更多的信息,比如系统中有几块网卡,他们的Mac地址是多少,每块网卡分配了几个IP(一个网卡对应多个IP)等等。 这些信息往往需要通过ifconfig指令来获得,对于程序员来说,在代码中调用外部的shell指令可不是个最佳方案,因为没人能保障

wuhuaiyu的专栏 775

如何成为Linux平台C语言程序员(zhuan)

目标: 成为合格的Linux平台C语言程序员 技能: 掌握C语言基本语法,掌握Linux平台系统调用,熟悉Linux平台开发流程,掌握anjuta以及glade使用方法,了解kernel结构编写高质量程序。 步骤: 1、学习C语言语法 预计时间:30天 参考书籍 http://man.lupaworld.com/content/develop/c&c++/c/C_program_lan...

weixin_34051201的博客 126

Linux gcc getcwd()的实现 zhuan

通过getcwd()可以获取当前工作目录。 1 #include <unistd.h> 2 3 char *getcwd(char *cwdbuf, size_t size); 转载于:https://www.cnblogs.com/huashiyiqike/p/3834055.html...

aocandr8991的博客 252

[zhuan]Linux下GDB调试跟踪工具

<br />http://blog.163.com/qianshch@126/blog/static/48972522200971195543869/<br /> <br /> <br />公司给我一个很重要的任务——阅读大约十几万行的C语言代码,读懂后要画流程图并讲解。老总提示要在Linux下进行调试跟踪,才比较容易理解。于是,我上网搜了很多关于GDB的文章,认真阅读后受益匪浅。下面是对我今天学习内容的总结——主要是将GDB的命令做记录。<br />一、执行程序<br />1、run命令  可附带给程序的

quanquan902000的专栏 469

linux c 交叉编译,如何获得uClinux的交叉编译工具(zhuan)

From wikiPodLinuxTo build binaries for the iPod you will need a special versionof the GNU toolchain, where the compiler is configured as across compiler. This is used to generate binaries on yourdevel...

weixin_32973319的博客 307

linux服务器安装gmt,linux 安装GMT详解 (zhuan)

linux 安装GMT详解 (zhuan)linux 安装GMT详解已有 138 次阅读2012-4-28 23:42|系统分类:科研笔记|关键词:linux安装GMT1、首先安装NetCDF文件NetCDF文件是一种科学数据存储格式,广泛用于大气、海洋和地球科学。NetCDF也是一个函数库集合,提供给用户一整套使用和操作该种格式数据的方法。该格式是跨平台的,且可以使用C、Fortran和Matl...

weixin_34374684的博客 1106

Windows和Linux动态库比较 (Zhuan)

Windows和Linux动态库比较 Description: 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库 可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植。本文分析和比较了两种操作系统动态库技术,并给出了将...

weixin_30852419的博客 101

zhuan vi 命令

linux下vi命令大全 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后一行首 vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处 vi -r filename :在上次正

visualdancing 342

Linux网络编程一步一步学 - 目录(汇总)zhuan

非常好的关于Linux网络编程的文章,我也是无意中在别人的博客里发现的,在网上搜了一下,这类的文章总共还有很多,最后我找到了原作者的姓名 - 周立发,以及作者的博客空间。本人坚决支持原创,在此将其文章进行了汇总,并且空间首页加入了他的博客链接。大家看过他的空间之后,相信也会收获不少。 Linux网络编程一步一步学-UDP方式点对点通讯 作者:周立发 2007-01-24 21:24:33L

imxiangzi的专栏 917

用MFC实现串口编程 (zhuan)

用MFC实现串口编程 (作者:付杰 200008月04日 11:28) 龚建伟评论:本文既写了在Windows中怎样用VC控件MSComm,又说明了API技术编程方法,在写用MSComm控件时,数据类型的转换说得不是太明白,初次涉猎串口编程的朋友恐怕看了还是编不出来;直接从底层编写的部分值得一读,说得较为详细,但你得先从VC教本上看一看什么是线程。 目次:(目次添加:龚建伟) 一.串行通信的基本

北风 987
上一篇: C语言中可变参数的用法
下一篇: sockaddr_in/
grasspower
博客等级 码龄19年 12粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值