第1章 网络编程基础(3)——基本Socket通信

本文详细介绍了服务器和客户端在网络通信中的常用模型,包括初始化监听Socket、建立连接、收发数据及关闭连接的过程。服务器端需绑定特定IP与端口,监听并接受客户端连接请求;客户端则需指定服务器IP与端口发起连接。双方通过Socket进行数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器常用模型

(1)初始化监听Socket

初始化Socket

SOCKET s;
s = socket(AF_INET,SOCKET_STREAM,IPPROTO_TCP);
//创建一个Socket作为监听端口
//Socket种类为流Socket
//使用的网络协议为TCP协议
//Socket家族取值为AF_INET

绑定Socket

SOCKETADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htnos(9000);
bind(s,(LPSOCKETADDR)&addr,sizeof(addr));
//Socket家族取值为AF_INET
//服务器地址为127.0.0.1
//服务器使用的端口为9000

开始监听

listen(s,SOMAXCONN);
//连接最大数取系统设置最大值

 

(2)建立连接

检测Socket状态

函数Select可以检测相应Socket状态,从而决定是否需要建立新的连接。

fd_set readset;
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(s,&readset);
int ret = select(FD_SETSIZE,&readset,NULL,NULL,&timeout);
if(ret>0&&FD_ISSET(s,&readset))
{
 //新连接   
}

 

建立新的连接

如果客户端有新的连接请求送入,则建立一个新的连接

SOCKADDR_IN addr;
int len = sizeof(addr);
SOCKET temp;
temp = accept(s,(SOCKADDR*)&addr,(socklen_t*)&len);
if(temp == INVALID_SOCKET){
//连接失败
}

 

(3)收发数据

检测读入数据

fd_set readset;
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(s,&reader);
int ret = select(FD_SETSIZE,&readset,NULL,NULL,&timeout);
if(ret>0&&FD_ISSET(s,&readset))
{
//有新的数据
}

 

接收数据

char buf[1024];
int ret;
ret = recv(s,buf,1024,0);

 

检测发送数据

fd_set writeset;
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&wtiteset);
FD_SET(s,&writeset);
int ret = select(FD_SETSIZE,&writeset,NULL,&timeout);
if(ret>0&&FD_ISSET(s,&writeset))
{
//可以发送数据
}

 

发送数据

char buf[1024];
int ret;
ret = send(s,buf,1024,0);

 

(4)关闭连接
closesocket(s);

 

客户端常用模型

(1)初始化Socket

创建socket

SOCKET s;
s = socket(AF_INET,SOCKET_STREAM,IPPROTO_TCP);
//创建一个Socket作为监听端口
//Socket种类为流Socket
//使用的网络协议为TCP协议
//Socket家族取值为AF_INET

 客户端和服务器端选择的Socket种类保持一致。

绑定端口

客户端的IP地址和端口号都不需要固定,可以由系统自动进行分配。

SOCKETADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(0);
bind(s,(LPSOCKADDR)&addr,sizeof(addr));
//Socket家族取值为AF_INET
//客户端IP地址和端口由系统指定
(2)建立连接

在发送连接请求时,需要指定服务器的端口号与IP地址。

ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(9000);
ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
connect(s,(SOCKADD*)&ServerAddr,sizeof(ServerAddr));
//服务器Socket家族取值为AF_INET
//服务器端口号为9000
//服务器IP地址为127.0.0.1

 

(3)收发数据

与服务器相同

(4)关闭连接

与服务器相同

转载于:https://www.cnblogs.com/msnow/p/5265555.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值