网络编程之套接字

套接字是操作系统内核中的一个数据结构,网络节点间可以通过它进行相互通信。网络通信其实也还是进程间的通信,是不同计算机上的进程间通信。而在网络中,每一个节点都有一个网络地址,即IP地址,所以两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以网络地址并不能够确定要和网络中的哪一个进程进行通信,所以这时需要更多的信息,因此套接字还会包括其他的信息,即端口号。一台计算机中,一个端口号只能分配给一个进程,即在一个计算机中,端口号和进程之间是一一对应的关系。所以,网络端口号和网络地址可以组合用来唯一地确定整个网络中的一个网络进程。

Sockect类型:

1、流式Socket(SOCK_STREAM):用于TCP通信,流式套接字提供可靠的、面向对象连接的通信流,使用TCP协议,从而保证数据传输的正确性和顺序性

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

3、原始Socket(SOCK_RAW):英语新的网络协议实现的测试等,允许对底层协议如IP或ICMP进行直接访问

Socket信息数据结构:

struct sockaddr

{

         unsigned short sa_family;/*地址族*/

         char sa_data[14];/*14字节协议地址,包含该Socket的IP地址和端口号*/

};


     struct sockaddr_in

     {

         short int sa_family;        /*地址族*/

         unsigned short int sin_port;   /*端口号*/

         struct in_addr sin_addr;     /*IP地址*/

         unsigned char sin_zero[8];    /*填充0以保持与struct sockaddr同样大小*/

     };

struct in_addr

{

         unsigned long int s_addr;     /*32位IPv4地址,网络字节序*/

};

大端模式&小端模式(在计算机数据存储的两种字节优先顺序)

1、大端模式:高字节优先存放在内存低地址里;

2、小端模式:低字节优先存放在内存高地址里。

例如:在内存中存放数0x12345678,大端模式存放,真实的数是0x12345678,小端模式存放,真实的数是0x78563412。

字节转换函数:htons()、ntohs()、htonl()和ntohl(),都是用来实现网络字节序和主机字节序的转化,h代表host,n代表network,s代表network,s代表short,l代表long。通常16位的IP端口号用s表示,IP地址用l代表。

网络编程里要用到的函数:

1、socket函数

  头文件:#include <sys/types.h>

  #include <sys/socket.h>

  原型:int socket(int domain,int type,int protocol)

  功能:建立一个Socket通信

  函数:domain:指定使用何种的地址类型,若AF_INET(IPv4网络协议),AF_INET6(IPv6网络协议)

type:SOCK_STREAM:面向数据流TCP

    SOCK_DGRAM:使用不连续不可靠的数据报连接UDP

    SOCK_RAW:原始网络协议存储

protocol:指定socket所使用的传输协议编号,一般设为0

 返回值:成功,返回socket套接字描述符;出错,返回-1。


2、bind函数

  头文件:#include <sys/types.h>

  #include <sys/socket.h>

 功能:绑定IP地址

 原型:int bind(int sockfd,struct sockaddr * my_addr,int addrlen)

 参数:sockfd:socket套接字描述符

     my_addr:主机地址

     addrlen:socket的sockaddr的结构长度

 返回值:成功,返回0;失败,返回-1


3、connect函数

 头文件:#include <sys/types.h>

 #include <sys/socket.h>

 功能:建立socket连接,客户端连接服务器

 原型:int coonect(int sockfd,struct sockaddr * servaddr,int addrlen)

 参数:sockfd:socket套接字描述符

servaddr:要连接的服务器地址

addrlen:struct sockaddr的长度

 返回值:成功,返回0;失败,返回-1


4、listen函数

 头文件:#include <sys/socket.h>

  功能:监听网络,等待连接

  原型:int listen(int sockfd,int backlog)

  参数:sockfd:socket套接字描述符

backlog:允许连接接入的客户端的数目,即同时可以处理的最大客户数目

  返回值:成功,返回0;失败,返回-1

  注意:listen并没有连线,只是设置socket的聆听模式,真正实现连接的是accept函数


5、accept函数

 头文件:#include <sys/types.h>

 #include <sys/socket.h>

 功能:接收网络连接,客户端连接,这里有三次握手机制

 原型:int accept(int sockfd,struct sockaddr* addr,int * addrlen)

 参数:sockfd:socket套接字描述符

     addr:远端客户端的地址

addrlen:要注意此处是一个指针

 返回值:成功,返回新的sockfd,失败,返回-1


6、send函数

  头文件:#include <sys/types.h>

 #include <sys/socket.h>

  功能:经socket向对方传递数据

  原型:int send(int sockfd,const void* msg,int len,unsigned int flags)

  参数:sockfd:accept返回的新的socket套接字描述符,连接远方的IP地址

msg:要传输的数据

     len:传输的数据长度

     flags:一般设置为0

 返回值:成功,返回实际传输的字节数;失败,返回-1


7、recv函数

 头文件:#include <sys/types.h>

 #include <sys/socket.h>

 功能:经socket接收数据

 原型:int recv(int sockfd,void *buf,int len,unsigned int flags)

 参数:sockfd:accept返回的新的socket套接字描述符

buf:存放接收到的地址

len:接收地址最大长度

flags:一般设置为0

 返回值:成功,返回接收到的字符数;失败,返回-1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值