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

服务器常用模型

(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)关闭连接

与服务器相同

posted @ 2016-05-29 20:33  Msnow  阅读(436)  评论(0编辑  收藏  举报