linux——socket编程步骤(api介绍)

 服务器和客户端的开发步骤:

        1、创建套接字

        2、为套接字添加信息(ip地址和端口号),下一步需要地址转换,

        3、监听网络连接

        4、监听到有客户端接入,接受连接(如果没有接入阻塞到这里)

        5、服务器与客户端数据交互

        6、关闭套接字,断开连接

api简介:

1、创建套接字:

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

domain:

        指明所使用的协议族,通常为AF_INET,表示互联网协议族(tcp/ip协议族);

        AF_INET        IPv4因特网域(192.168.……)

        AF_INET6        IPv6因特网域

        AF_UNIX        Unix域

        AF_ROUTE        路由套接字

        AF_KEY        密钥套接字

        AF_UNSPEC        未指定

type参数指定socket的类型

        SOCK_STREAM:流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。

        SOCK_DGRAM:数据报套接字定义了一种无连接的服务器,数据通过相互独立的报文进行传输,是无序的,并且不能保证是可靠、无差错的。使用UDP协议

        SOCK_RAW:允许程序使用低层协议,原始套接字允许对底层协议如IP或ICMP进行访问,功能强大但较为不便,主要用于一些协议的开发。

protocol:

        通常赋值"0"。0选择type类型对应的默认协议

        IPPROTO_TCP        TCP传输协议

        IPPROTO_UDP        UDP传输协议

        IPPROTO_SCTP        SCTP传输协议

        IPPROTO_TIPC        TIPC传输协议

        

 2、地址准备好bind()函数,ip地址和端口号

#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);






//ipv4对应的是;
struct sockaddr{

    unisgned short as_family;//协议族
    char           sa_data[14];
};

//同等替换
struct sockaddr_in{
    sa_family_t    sin_family;//协议族
    in_port_t      sin_port;  //端口号
    struct in_addr sin_addr;  //ip地址结构体
    unsigned char  sin_zero[8];//填充,没有实际意义,只是为跟sockaddr结构在内存中对齐,这样才能相互转换
};

功能:

        用于绑定ip地址和端口号到socketfd

参数:

        sockfd:是一个socket描述符

        addr:是一个指向含有本机ip地址及端口号等信息的sockaddr类型的指针,指向要绑定给sockfd的协议地址结构,这个地址结构根据地址创建socket时的地址协议族的不同而不同。

 3、地址转换api

//字符串形式"192.168.……"转为网络能识别的格式
int inet_aton(const char* straddr, struct in_addr *addrp);


//把网络格式的ip地址转为字符串形式
char* inet_ntoa(struct in_addr inaddr);

4、监听listen()函数

#include <sys/types.h>
#include <sys/socket.h>

int listen(int sockfd, int backlog);

 功能:

        listen函数只用于服务器端,服务器进程不会主动要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后相应该连接请求,一个服务器可以同时处理多个客户进程的连接。2个功能:①将一个未连接的套接字转换为一个被动套接字(监听)②规定内核为相应套接字排队的最大连接数。

        内核为任何一个给定监听套接字维护两个队列:①未完成连接队列,每个这样的SYN报文段对应其中一项:已由某个客户端发出并到达服务器,而服务器正在努力等待完成相应的TCP三次握手过程。这些套接字处于SYN_REVD状态。②已完成连接队列,每个已完成TCP三次握手过程的客户端对应其中一项。这些套接字处于ESTABLISHED状态。

参数:

        sockfd:是socke系统调用返回的socke描述符

        backlog:指定在请求队列中允许的最大请求数

 5、连接accept函数        

#include <sys/types.h>
#include <sys/socket.h>

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

功能:

        accept函数由TCP服务器调用,用于从已完成连接队列头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。

sockfd:

        是socket系统调用返回的服务器端socket描述符。

addr:

        用来返回已连接的对端(客户端)的协议地址

addrlen;

        客户端地址长度

返回值:

        该函数的返回值是一个新的套接字描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字(表示TCP三次握手已完成),当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。

6、数据收发read(),write()

ssize_t write(int fd, const void *buf,size_t nbytes);

ssize_t read(int fd, void *buf, size_t nbyte);

//返回值:返回读或写的字节个数,出错返回-1

        第一个将buf中的nbyte个字节写入fd中,成功返回写入的字节个数

        第二个从fd中读取nbyte个字节到buf中,返回实际读取的字节数。

        网络i/o还有一些函数,例如:recv()/send(), readv()/writev(), recvmsg()/sendmsg(), recvfrom()/sendto()等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值