Linux网络编程入门必备函数说明

来源:互联网 发布:centos debian 稳定性 编辑:程序博客网 时间:2024/06/02 20:02

服务器端

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

domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等). 
AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,
type:我们网络程序所采用的通讯协议,SOCK_STREAM表明我们用的是TCP协议,SOCK_DGRAM 表明我们用的是UDP协议,

protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了

sockfd = socket(AF_INET,SOCK_STREAM, 0)


2、int bind(int sockfd, struct sockaddr *my_addr, int addrlen)

sockfd:是由socket调用返回的文件描述符.

addrlen:是sockaddr结构的长度.

my_addr:是一个指向sockaddr的指针. 
中有sockaddr的定义
struct sockaddr_in {
   short int sin_family; /* 通信类型 */
   unsigned short int sin_port; /* 端口 */
   struct in_addr sin_addr; /* Internet 地址 */
   unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
   };

我们主要使用Internet所以sin_family一般为AF_INET,
sin_addr设置为INADDR_ANY表示可以和任何的主机通信,sin_port是我们要监听的端口号.
sin_zero[8]是用来填充的. bind将本地的端口同socket返回的文件描述符捆绑在一起.
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(portnumber);


3、int listen(int sockfd, int backlog);
sockfd 是调用 socket() 返回的套接字文件描述符。backlog 是在进入 队列中允许的连接数目。


4、int accept(int sockfd, struct sockaddr *addr,int *addrlen)
sockfd:是listen后的文件描述符.
addr, addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了. 
bind,listen和accept是服务器端用的函数,
accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. 
accept成功时返回最后的服务器端的文件描述符

new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)


注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

TCP通信模式

Linux网络编程--服务器客户端(TCP实现)

客户端

 result = connect(sockfd, (struct sockaddr*)&address, len);  

    //communicate with server socket
    while(1)
    {
        printf("set send content:");
        scanf("%c",&ch);
        write(sockfd, &ch, 1);
        printf("send to server:%c \n",ch);
        read(sockfd, &ch, 1);
        printf("read from server: %c\n", ch);
        
        
    }

之后还有关于客户端开启多线程上传数据到服务端,以及服务端开启多线程处理多个客户端的连接与数据通信。暂且不写了。