网络编程入门知识
Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用。
socket通常也称作"套接字",用于描述IP 地址和端口,是一个通信链的句柄,也可以看成是一种文件描述符 。socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。
socket类型:
①。流式套接字(SOCK_STREAM)
流式套接字可以提供可靠的,面向连接的通讯流,它使用TCP协议。
②。数据报套接字(SOCK_DGRAM)
数据报套接字定义了一种无连接的服务,数据报通过相互独立的报文进行传输,是无序的并且不保证可靠 ,它用UDP协议。
③。原始套接字(SOCK_RAM)
原始套接字允许使用IP协议,主要用于新的网络协议的测试等。
在socket程序设计中,struct sockaddr用于记录网络地址,其结构如下:
struct sockaddr
{
u_short sa_family;//协议簇,采用AF_XXX形式,如AF_INET(IP协议簇)。
char sa_data[14]; // 14字节的特定协议地址
}
然而编程一般使用与sockaddr等价的sockaddr_in结构,sockaddr_in结构如下:
struct sockaddr_in
{
short int sin_family ; //协议簇
unsigned short int sin_port; //端口号
struct in_addr sin_addr; //协议特定地址,具体结构看下面 ····
unsigned char sin_zero[8]; //填0
}
struct in_addr的结构如下:
struct in_addr
{
union
{
struct{unsigned char s_b1,s_b2,s_b3,s_b4;}S_un_b; // An IPv4 address formatted as four u_chars.
struct{unsigned short s_w1,s_w2;}S_un_w; // An IPv4 address formatted as two u_shorts
unsigned long s_addr; // An IPv4 address formatted as a u_long.
}S_un;
}
地址转换
int inet_aton(const char *cp,struct in_addr *inp);
char *inet_ntoa(struct in_addr *inp);
函数里面的 a 代表 ASCII,n 代表 network
inet_aton函数是将a.b.c.d形式的IP转换为32位的IP存储在inp指针里。
inet_ntoa函数是将32位的IP地址转换位a.b.c.d的格式。
字节序转换
htons函数:把unsigned short类型从主机序转换到网络序
htonl函数:把 unsigned long类型的从主机序转换到网络序
ntohs函数:把unsigned short类型从主机序转换到网络序
ntols函数:把unsigned long类型从主机序转换到网络序
IP与主机名
struct hostent *gethostbyname(const char *hostname); //获得主机名的函数,其返回值是一个名hostent的结构体
struct hostent的结构如下:
struct hostent
{
char *h_name; //主机的正式名称
char *h_aliases; //主机的别名
int h_addrtype; //主机的地址类型,AF_INET
int h_length; //主机的地址长度
char **h_addr_list; //主机的ip地址列表
}
#define h_addr h_addr_list[0] //主机的第一个IP地址
socket编程函数
1. int socket(int domain, int type, int protocol);
创建一个socket,返回值:非负数-----创建成功,-1-------创建失败
family:协议簇
type:套接字的类型:是流式套接字?数据报套接字还是原始套接字?
protocol: 套接口所用的协议。如调用者不想指定,可用 0
其返回值:调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。
2. int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
用于绑定Ip地址和端口号到socket
socket:是一个套接字。
address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
address_len:确定缓冲区的长度。
其返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
3. int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
该函数用于与服务器建立连接
sockfd:套接字描述符
serv_addr:指向数据机构sockaddr的指针,其中包括目的端口和IP地址
addrlen:参数二sockaddr的长度。(可以通过sizeof(struct sockaddr)获得 )
其返回值:成功则返回0,失败返回-1。
4. int listen(int sockfd, int backlog);
listen函数在一般在调用bind之后-调用accept之前调用。
sockfd:套接字描述符
backlog:连接请求队列(queue of pending connections)的最大长度(一般由2到4)。用SOMAXCONN则由系统确定。
其返回值:无错误,返回0, 否则,返回SOCKET ERROR,可以调用函数WSAGetLastError取得错误代码。
5. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
该函数用来等待来自客户端的socket连接请求。
sockfd:套接字描述符
addr:指向结构体sockaddr的指针。
addrlen: addr参数指向的内存空间的长度。
其返回值:成功返回新套接字描述符;失败返回错误信息 。
6. size_t send ( int s , const void *msg , size_t len , int flags);
该函数用来发送数据
s:发送端套接字描述符;
msg:一个存放应用程式要发送数据的缓冲区;
len:实际要发送的字节数;
flags:一般为0
其返回值:成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。
7. int recv( int s, coid* msgbuf, size_t len, int flags);
该函数用于接收数据
s:一个标识已连接套接口的描述字。
len:缓冲区长度。
flags:指定调用方式。
以上纯属个人自学总结的知识,欢迎大神指正批评········