linux高性能服务器编程高性能服务器租用


Unsignedlonginthtonl(unsignedlonginthostlong);

Unsignedshortinthtons(unsignedshortinthostshort);

Htonl表示“worklong”,即将长整型(32bit)的主机字节序数据转化为网络字节序数据。这4个函数中,长整型函数通常用来转换IP地址,短整型函数用来转换端口号(当然不限于此。任何格式化的数据通过网络传输时,都应该使用这些函数来转换字节序)。

_ntoa函数将用网络字节序整数表示的IPv4地址转化为用点分十进制表示的IPv4地址。但需要注意的是,该函数内部用一个静态变量存储转化结果,函数的返回该静态内存,因此

Constchar*_(intaf,oid*src,char*dst,socklen_t);

Intbind(intsockfd,conststructsockaddr*my_addr,socklen_taddrlen);

Backlog参数提示内核监听队列的最大长度。ESTABLISHED,SYS_RCVD。

ept(intsocket,structsockaddr*addr,socklen_t*addrlen);

Intconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlne);

sockfd参数由socket系统调用返回一个socket。Serv_addr参数是服务器监听的socket地址,addrlen参数则制定这个地址的长度。

fd参数是待关闭的socket。不过,close系统调用并非总是立即关闭一个连接,而是将fd引用计数减
一。只有当fd的引用计数为0时,才真正关闭连接。多进程程序中,一次fork系统调用默认将使父进程中打开的socket的引用计数加

1,因此必须在父进程和子进程中都对该socket执行close调用才能将连接关闭。

如果需要立即终止连接(而不是将socket的引用计数减1),使用shutdown系统调用(相对close来说,它是专门为网络编程设计的):

ssize_trecv(intsockfd,void*buf,size_tlen,intflags);

sszie_tsend(intsockfd,oid*buf,size_tlen,intflags);

Flags:MSG_CONFIRM,MSG_DONTROUTE,MSG_DONTWAIT,MSG_MORE,

Flags参数只对send和recv的当前调用有效,可以通过setsockopt系统调用永久性修改socket的某些属性。

ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr

ssize_tsendto(intsockfd,oid*buf,size_tlen,intflags,conststructsockaddr*

Recvfrom/sendto系统调用也可以用于面向连接(STREAM)的socket的数据读写,

只需要把最后两个参数都设置为NULL以忽略发送端/接收端的socket地址(因为我们已经和对方建立了连接,所以已经知道其socket地址了)。

Ssize_trecvmsg(intsockfd,structmsghdr*msg,intflags);

Ssize_tsendmsg(intsockfd,structmsghdr*msg,intflags);

Sockatmark判断sockfd是否处于带外标记,即下一个被取到的数据是否是带外数据。

如果是,sockatmark返回

1,此时我们就可以利用带MSG_OOB标志的recv调用来接收带外数据。如果不是,则sockatmark返回
0。

内核通知应用程序带外数据到达的两种常见方式是:I/O复用产生的异常事件和SIGURG信号。

Intgetsockname(intsockfd,structsockaddr*address,socklen_t*address_len);

Intgetpeername(intsockfd,structsockaddr*address,socklen_t*address_len);

intgetsockopt(intsockfd,intlevel,tion_name,void*option_value,socklen_t*tion_len);

intsetsockopt(intsockfd,intlevel,tion_name,oid*option_value,tion_len);

sockfd参数指定被操作的目标socket。Level参数指定要操作哪个协议的选项(即属性),

注意:对服务器而言,有部分socket只能由ept调用返回,而ept从listen监听socket设置才有效。

监听socket选项特性:对监听socket设置这些socket选项,那么ept返回的连接socket将自动继承这些选项。这些socket选项包括:SO_DEBUG,SO_DONTROUTE,SO_KEEPALIVE,SO_LINGER,SO_OOBINLINE,SO_RCVBUF,SO_RCVLOWAT,

SO_SNDBUF,SO_SNDLOWAT,TCP_MAXSEG和TCP_NODELAY。而对客户端而言,这些选项要在调用connect函数之前设置,因为connect调用成功返回之后,TCP三次握手已经完成。

TCP连接TIME_WAIT状态,并提到服务器程序可以通过设置socket选项SO_REUSEADDR来强制使用被处于TIME_WAIT状态的连接占用的socket地址。