当前位置: 技术问答>linux和unix
客户端---服务器模式通讯程序的问题
来源: 互联网 发布时间:2016-05-15
本文导语: 客户端---服务器模式通讯程序,客户端fork多个子进程,每个子进程都用一个socket 作connect请求连接同一个远端服务器,(相当于在一台机子上用多个子进程模拟了多个客户端),在这个socket上发送消息到服务器,然后...
客户端---服务器模式通讯程序,客户端fork多个子进程,每个子进程都用一个socket 作connect请求连接同一个远端服务器,(相当于在一台机子上用多个子进程模拟了多个客户端),在这个socket上发送消息到服务器,然后在recv函数等待recv服务器发回的应答,
如下程序流程结构:
for (;;)//不断的产生子进程
{
if (0 == fork())
{
//每个子进程里用sock_Client连接服务器
sock_Client=socket(...);
。。。。。
connect( sock_Client,...);
send( sock_Client,。。。);//先发送数据到服务器
recv( sock_Client,。。。。);//阻塞在recv,等待服务器返回数据
.....
}
}
问题1. 子进程没有recv到应答就阻塞,那么要判断超时怎样做?子进程总不能无限时等待应答,
问题2 如不做额外措施,能否保证每个子进程收到属于自己的应答,不会误收服务器发到别的子进程的消息?要知道服务端收到的可是来自于同一ip地址的消息,而且从代码上每个子进程用的是同名sock_Client作接收消息
我自己对第一个问题的回答:每个子进程里用select函数实现判断超时
fd_set rdfds; /* 先申明一个 fd_set 集合来保存我们要检测的 socket句柄 */
struct timeval tv; /* 申明一个时间变量来保存时间 */
int ret; /* 保存返回值 */
FD_ZERO(&rdfds); /* 用select函数之前先把集合清零 */
FD_SET(sock_Client, &rdfds); /* 把要检测的句柄socket加入到集合里 */
tv.tv_sec = 1;
tv.tv_usec = 500; /* 设置select等待的最大时间为1秒加500毫秒 */
ret = select(sock_Client + 1, &rdfds, NULL, NULL, &tv); /* 检测我们上面设置到集合rdfds里的句柄是否有可读信息 */
if(ret
如下程序流程结构:
for (;;)//不断的产生子进程
{
if (0 == fork())
{
//每个子进程里用sock_Client连接服务器
sock_Client=socket(...);
。。。。。
connect( sock_Client,...);
send( sock_Client,。。。);//先发送数据到服务器
recv( sock_Client,。。。。);//阻塞在recv,等待服务器返回数据
.....
}
}
问题1. 子进程没有recv到应答就阻塞,那么要判断超时怎样做?子进程总不能无限时等待应答,
问题2 如不做额外措施,能否保证每个子进程收到属于自己的应答,不会误收服务器发到别的子进程的消息?要知道服务端收到的可是来自于同一ip地址的消息,而且从代码上每个子进程用的是同名sock_Client作接收消息
我自己对第一个问题的回答:每个子进程里用select函数实现判断超时
fd_set rdfds; /* 先申明一个 fd_set 集合来保存我们要检测的 socket句柄 */
struct timeval tv; /* 申明一个时间变量来保存时间 */
int ret; /* 保存返回值 */
FD_ZERO(&rdfds); /* 用select函数之前先把集合清零 */
FD_SET(sock_Client, &rdfds); /* 把要检测的句柄socket加入到集合里 */
tv.tv_sec = 1;
tv.tv_usec = 500; /* 设置select等待的最大时间为1秒加500毫秒 */
ret = select(sock_Client + 1, &rdfds, NULL, NULL, &tv); /* 检测我们上面设置到集合rdfds里的句柄是否有可读信息 */
if(ret