一个完整socket的相关描述(协议,本地地址,本地端口,远程地址,远程端口);

每个socket有一个本地的唯一socket号,由操作系统分配。



=====================================================================================

#include<sys/socket.h>

int socket(int domain,int type,int protocol); //成功返回描述符,出错返回-1。



domain:

AF_INET(IPv4因特网域)

AF_INET6(IPv6因特网域)

AF_UNIX(UNIX域)

AF_UNSPEC(未指定)



type:

SOCK_DGRAM(无连接基于数据报)

SOCK_STREAM(面向连接基于字节流)

SOCK_SEQPACKET(面向连接基于数据报)

SOCK_RAW(IP协议数据报接口)



protocol:

通常为0,表示选择默认协议。

(AF_INET、SOCK_DGRAM、UDP)

(AF_INET、SOCK_STREAM、TCP)

=====================================================================================

字节序列转换



转换端口号:

htons()

ntohs()

转换IP:

htonl()

ntohl()

=====================================================================================

通用地址格式

struct sockaddr{

unsigned short sa_family;//address族,AF_xxx

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

}

sa_family一般来说,IPV4使用AF_INET。

sa_data包含了一项远程电脑的地址,端口和套接字的数目,里面的数据是杂溶在一起的

=====================================================================================

因特网地址格式

struct in_addr{

in_addr_t s_addr //ipv4

};

struct sockaddr_in{

short int sin_family; //地址族

unsigned short int sin_port; //端口号

struct in_addr sin_addr; //ip地址

unsigned char sin_zero[8]; //添0

}

=====================================================================================

地址格式转换

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

const char *inet_ntop(int domain,const void *addr,char *str,socklen_t cnt);//转换成点分十进制

成功返回字符串指针,出错返回NULL。

int inet_pton(int domain,const char *str,void *addr); //转换成二进制整数

成功返回1,无效格式返回0,出错返回-1。

======================================================================================

套接字域地址绑定

#include <sys/socket.h>

int bind(int sockfd,const struct sockaddr *addr,socklen_t len);//绑定地址并在/etc/servies中注册

int getsockname(int sockfd,struct sockaddr *addr,socklen_t alenp);//查找绑定到套接字的地址

int getpeername(int sockfd,struct asockaddr *addr,socklen_t *alenp);//获取对方地址

成功返回0,出错返回-1。

======================================================================================

客户端:

#include <sys/socket.h>

int connect(int sockfd,const struct sockaddr *addr,socklen_t len);

成功返回0,出错返回-1.

服务端:

#include <sys/socket.h>

int listen(int sockfd,int backlog);

成功返回0,出错返回-1.

int accept(int sockfd,struct sockaddr *addr,socklen_t len);

======================================================================================

tcp 用write read

======================================================================================

udp 用

#include <sys/socket.h>

ssize_t send(int sockfd,const void *buf,size_t nbytes,int flags);

ssize_t sendmsg(int sockfd,const struct msghdr *msg,int flags);

成功返回发送字节数,出错返回-1.

struct msghdr{

void *msg_name; //optional address

socklen_t msg_namelen; //address size in bytes

struct iovec *msg_iov; //array of I/O buffers

int msg_iovlen; //number of elements in array

void *msg_control; //number of ancillary bytes

int msg_flags; //flags for received message

}



ssize_t recv(int sockfd ,void *buf,size_t nbytes,int flags);//常用

ssize_t recvfrom(int sockfd ,

void *buf,

size_t len,

int flags,

struct sockaddr *addr,

socklen_t *addrlen);

ssize_t recvmsg(int sockfd,struct msghdr *msg,int flags);

返回消息字节数,无消息返回0,出错返回-1.

=======================================================================================