linux网络编程--socket(1)

 网络程序和普通程序最大的区别就是,网络程序是由两部分组成的--server/client.一般情况下,是先运行server端上的程序,然后等待client端上的程序运行并建立连接,server端上的程序在一个端口监听,等待client端发来的请求.

 

int socket(int domain,int type,int protocol)

domain:说明通讯程序所在主机所采用的通讯协议类(AF_INET和AF_UNIX等);AF_UNIX只能用于单一的UNIX系统进程间通讯,AF_INET是针对internet的,可以用于远程主机间的通讯;

type:网络程序所采取的通讯协议(SOCK_STREAM和SOCK_DGRAM);

protocl:所采取的协议,一般设置为0就可以了,主机会自动选择合适的协议.

 

int bind(int sockfd,struct sockaddr * myaddr,int addrlen)

sockfd:是socket的返回的文件描述符,用于监听的socket;

addrlen:是sockaddr结构的长度;

myaddr:是一个指向sockaddr的结构体的指针;

对于sockaddr结构体的定义:

struct sockaddr

{

    unsigned short as_family;

    char as_data[14];

}

由于系统的兼容性,用另外一个结构体替代,sockaddr_in:
struct sockaddr_in

{

   unsigned short sin_family;

   unsigned short sin_port;

   struct in_addr sin_addr;

   unsigned char sin_zero[8];

}

sin_addr一般是设置为INADDR_ANY,可以接受任何主机的通讯,sin_port是要监听的端口,bind()将本地端口和socket绑定在一起,成功后返回0,失败时返回-1,和socket()一样.

 

int listen(int sockfd,int queuelen)

sockfd:bind()的socket描述符,用于监听的socket描述符;

queuelen:等候排队的最大长度.listen()将bind()的socket描述符变为监听的套接字,返回的情况和bind()一样.

 

int accept(int sockfd,struct sockaddr * addr,int addrlen)

sockfd:是listen后的文件描述符;

addr和addrlen:是给client端程序填写的,服务器只要传递指针就可以了;

bind(),listen()和accept()是服务端用的函数,accept()函数调用时,server端会一直阻塞到有一个client发出了连接请求,accept()成功时返回最后的服务器端的文件描述符,现在服务器端可以向该描述符写信息了.失败时返回-1.

 

int connect(int sockfd,struct sockaddr *servaddr,int addrlen)

sockfd:socket()返回的文件描述符;

servaddr:存储了server端的连接信息,里面的sin_family是服务器端的地址

addrlen:servaddr的长度;

connect()是client端用来和server端连接的函数,sockfd是和server端通讯的文件描述符,成功时返回0,失败时返回-1.

 

总结:socket在server端的走向是:socket()-->bind()-->listen()-->accept()

在client端的走向是:socket()-->connect().

你可能感兴趣的:(linux网络编程--socket(1))