Networking and Sockets (1)

来源:互联网 发布:冒险岛2 账号数据异常 编辑:程序博客网 时间:2024/06/04 17:57

Basic System calls For Connected Sockets

#include <sys/socket.h>

int socket(int domain, int type, int protocol); // type SOCK_STREAM, SOCK_DAGRAM

server

int bind(int socket_fd, const struct sockaddr* sa, socklen_t sa_len);

int listen(int socket_fd, int backlog /*maximum connnection queue length, SOMAXCONN*/);

int accept(int socket_fd, struct sockaddr* sa, socklen_t *sa_len);

client

int connect(int socket_fd, const struct sockaddr* sa, socklen_t sa_len);


Byte Order (Little vs. Big Endian)

#include <arpa/inet.h>

convert 16-bit/32-bit value from host to network byte order: (short/long)

uint16_t htons(uint16_t hostnum);

uint16_t htonl(uint32_t hostnum);

convert 16-bit/32-bit value from network to host byte order: (short/long)

uint16_t ntohs(uint16_t netnum);

uint16_t ntohl(uint32_t netnum);


Socket Address

#include <sys/socket.h>

struct sockaddr  --> abstract type of address

struct sockaddr_storage  --> guarantee to have enough space

AF_UNIX

#include <sys/un.h>

struct sockaddr_un 

{

sa_family_t sun_family;

char sun_path[X];

};

AF_INET

#include <netinet/in.h>

struct sockaddr_in

{

sa_family_t sin_family;

in_port_t sin_port;

struct in_addr sin_addr;

};

struct in_addr

{

in_addr_t s_addr;

};

-------------------------

sa.sin_port = htons(80)

sa.sin_addr.sin_addr.s_addr = htols((216UL<<24)+(109UL<<16)+(125UL<<8)+70UL); // 216.109.125.70

-------------------------

#include <arpa/inet.h>

convert dotted ipv4 address string to integer:

in_addr_t inet_addr(const char* cp);

convert integer ipv4 address to dotted string:

char* inet_ntoa(struct in_addr in);

more general functions:

inet_pton

inet_ntop


Socket Options

#include <sys/socket.h>

int setsockopt(

  int socket_fd,

  int level,

  int option,

  cont void* value,

  socklen_t value_len

);

int getsockopt(...); // same argments as setsockopt

standardized options for level SOL_SOCKET, which applies to the socket level itself.

bool true 1, false 0.

SO_ACCEPTCONN  get,bool  Socket is accepting connections.

SO_BROADCAST  set/get,bool  Sending of broadcast messages is allowed if supported.

SO_DEBUG  set/get,bool  Debug information is recorded.

SO_DONTROUTE set/get,bool Sent message bypass  the standard routing facilities and go directly to the network interface according to the destination address.

SO_ERROR get,int  Socket error status, which is cleared after it's received.

SO_KEEPALIVE  set/get,bool  Keep the connection active by periodically sending message. If there's no response, the socket is disconnected.

SO_LINGAR  set/get,X  If on, cause a close to block if there are any unsent messages unitl they're sent or the linger time expired.

struct linger{

  int l_onoff;

  int l_linger;

}

SO_OOBINLINE set/get,bool  Received out-of-band data stays inline.

SO_RCVBUF  set/get,int  Receive buffer size.

SO_RCVLOWAT set/get,int  Receive low-water-mark. Blocking receive operations block until the lesser of this amount and the requested amount are received.

SO_RCVTIMEO  set/get,X  Use a timeval structure for the maximum to wait for a blocking recevie operation to complete. Zero time (the default) means infinite.

SO_REUSEADDR seg/get,bool  bind allows resue of local address.

SO_SNDBUF  set/get,int  Send buffer size.

SO_SNDLOWAT set/get,int  Send low-water-mark. Nonblocking send operations send no data unlesss the lesser of this amount and the requested amount can be sent immediatly.

SO_SNDTIMEO  set/get,X  Use a timeval structure for the maximum time to wait for a blocking send operation to complete. Zero time (the default) means infinite.

SO_TYPE  set/get,int  Socket type (e.g. SOCK_STREAM).