首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux C语言高级编程之Socket网络编程!

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);

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171212G02SX800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券