Socket网络编程
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
基于socket的一对一通信模型
1、服务端:
1)创建socket,使用socket函数;
2)准备通信地址,使用结构体类型;
3)绑定socket和通信地址,使用bind函数;
4)进行通信,使用read/write函数;
5)关闭socket,使用close函数;
2、客户端:
1)创建socket,使用socket函数;
2)准备通信地址,使用服务器的地址;
3)连接socket和通信地址,使用connect函数;
4)进行通信,使用read/write函数;
5)关闭socket,使用close函数;
Socket通信相关函数
1、socket函数:创建用于通信的交流点
函数原型:
#include
#include
int socket(int domain, int type, int protocol);
参数解析:
1)域/协议族,决定了本地通信还是网络通信:
AF_UNIX/AF_LOCAL:表示实现同一个主机的本地通信;
AF_INET:表示基于ipv4的网络通信;
AF_INET6:表示基于ipv6的网络通信;
2)通信的方式,决定了选择何种通信协议:
SOCK_STREAM:提供有序的、可靠的、双向的以及面向连
接的字节流通信方式,也就是基于tcp协议的通信方式;
SOCK_DGRAM:提供不可靠的,非面向连接的数据报通信
方式,也就是基于udp协议的通信方式;
3)用于指定特殊的协议,默认给0即可;
返回值:成功返回用于交流的描述符,失败返回-1。
功能:主要用于创建用于通信的交流点。
通信地址的数据类型分文如下三种:
1)通用的通信地址类型:该数据类型专门用于函数的形参类型,很少作为定义变量使用。
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
};
2)本地通信的通信地址类型:专门用于本地通信的通信地址类型。
#include
struct sockaddr_un
{
sa_family_t sun_family;//地址族
char sun_path[];//socket文件的路径名
};
3)网络通信的通信地址类型:该数据类型专门用于网络通信。
#include
struct sockaddr_in
{
sa_family_t sin_family;//地址族AF_INET.
in_port_t sin_port;//端口号 从1025开始使用
struct in_addr sin_addr;//IP地址
};
struct in_addr
{
in_addr_t s_addr; //整数类型的IP地址
};
2、bind函数:用于绑定socket和通信地址
函数原型:
#include /* See NOTES */
#include
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
参数解析:
1)socket的描述符,socket函数的返回值;
2)结构体指针,需要做类型转换;
3)通信地址的大小,使用sizeof计算即可;
返回值:如无错误发生,则bind()返回0。否则的话,将返回-1;
功能:主要用于绑定socket和通信地址。
3、connect函数:用于连接socket和通信地址
函数原型:
#include
#include
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数解析:同bind函数
返回值:如无错误发生,则bind()返回0。否则的话,将返回-1;
功能:用于连接socket和通信地址,参数和返回值参考bind函数即可。
字节序及IP地址转换相关函数
1、字节序转换相关函数:
#include
1)将32位二进制的主机字节序转换为网络字节序:
uint32_t htonl(uint32_t hostlong);
2)将16位二进制的主机字节序转换为网络字节序:
uint16_t htons(uint16_t hostshort);
3)将32位二进制的网络字节序转换为主机字节序:
uint32_t ntohl(uint32_t netlong);
4)将16位二进制的网络字节序转换为主机字节序:
uint16_t ntohs(uint16_t netshort);
2、IP地址转换相关函数:
#include
#include
#include
1)将字符串形式的IP地址转换为整数类型:
in_addr_t inet_addr(const char *cp);
2)
将结构体类型的IP地址转换为字符串类型:
char *inet_ntoa(struct in_addr in);
领取专属 10元无门槛券
私享最新 技术干货