LINUX C网络编程学习笔记入门知识

网络编程入门知识

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函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。   

    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:一个标识已连接套接口的描述字。

   msgbuf:用于接收数据的缓冲区
   len:缓冲区长度。

   flags:指定调用方式。

以上纯属个人自学总结的知识,欢迎大神指正批评········ 

原文地址:https://www.cnblogs.com/scrat/p/2591853.html