Linux下的socket编程

本文详细介绍了Linux下基于socket的网络编程,包括流式、数据报、原始socket的分类,以及socket常用函数的使用,如bind、connect、listen、accept等。同时,讲解了TCP和UDP的客户端和服务端实现过程。
摘要由CSDN通过智能技术生成
  1. Linux下的网络编程的含义
    linux 网络编程是通过socket(套接字)接口实现,socket是一种文件描述符(可类比文件操作),socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种”打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个”文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
  2. 常见 socket 分类
    (1)流式socket(SOCK_STREAM )
    流式套接字提供可靠的、面向连接的通信流;它使用TCP 协议,从而保证了数据传输的正确性和顺序性。
    (2)数据报socket(SOCK_DGRAM )
    数据报套接字定义了一种无连接的服 ,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。
    (3)原始socket(SOCK_RAW)
    原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。
  3. socket 编程常用函数
    (1)int socket(int family, int type, intprotocol); 用以创建一个socket
    family指定协议族;type参数指定socket的类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;protocol通常赋值0, socket()调用返回一个整型socket描述符
    (2)int bind(int sockfd, struct sockaddr*my_addr, int addrlen); 用于绑定IP地址和端口号到socket
    sockfd是一个socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的针; addrlen常被设置为sizeof(struct sockaddr),bind()函数在成功被调 用时返回0;遇到错误时返回”-1”并将errno置为相应的错误号
    (3)int connect(int sockfd, struct sockaddr*serv_addr, int addrlen); 该函数用于绑定之后的client端,与服务器建立连接
    sockfd是目的服务器的sockect描述符;serv_addr是服务器端的IP地址和端口号的地址,addrlen常被设置为sizeof(struct sockaddr)。遇到错误时返回-1,并且errno中包含相 应的错误码
    (4)int listen(int sockfd, int backlog); 设置能处理的最大连接数,listen()并未开始接受连线,只是设置sockect为listen模式
    sockfd是socket系统调用返回的服务器端socket描述符;backlog指定在请求队列中允许的最大请求数
    (5)int accept(int sockfd, struct sockaddr*addr, int *addrlen); 用来接受socket连接
    sockfd是被监听的服务器socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求的客户端地址;addrten通常为一个指向值为 sizeof(struct sockaddr_in)的整型指针变量。错误发生时返回一个-1并且设置相应的errno值
    (6)int send(int sockfd, const void *msg, intlen, int flags); 发送数据
    sockfd是你想用来传输数据的socket描述符,msg是一个指向要发送数据的指针。 len是以字节为单位的数据的长度。flags一般情况下置为0
    (7)int recv(int sockfd,void *buf,intlen,unsigned int flags); 接收数据
    sockfd是接受数据的socket描述符;buf 是存放接收数据的缓冲区;len是缓冲的长度。flags也被置为0。recv()返回实际上接收的字节数,或当出现错误时,返回-1并置相应的errno值。
    (8)int sendto(int sockfd, const void *msg,intlen,unsigned int flags,const struct sockaddr *to,int tolen); 发送数据,用于面向非连接的socket(SOCK_DGRAM/SOCK_RAW)
    该函数比send()函数多了两个参数,to表示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof (struct sockaddr)。sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。
    (9)int recvfrom(int sockfd,void *buf,intlen,unsigned int flags,struct sockaddr *from,int *fromlen); 接受数据,用于面向非连接的socket(SOCK_DGRAM/SOCK_RAW)
    from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen常置为sizeof(struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或当出现错误时返回-1,并置相应的errno
  4. 其他数据结构各函数
    (1)in_addr_t inet_addr(const char *strptr); 将字符串IP地址转换为IPv4地址结构in_addr值
    (2)char * inet_ntoa(struct in_addr *addrptr); 将IPv4地址结构in_addr值转换为字符串IP
    (3)struct hostent *gethostbyname(const char*name); 域名和IP地址的转换
    函数返回一种名为hostent的结构类型,它的定义如下:
    struct hoste
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值