select 和 send问题

guopo 2008-07-06 09:30:41
我有多个客户端需要向服务器端传输数据,客户端的每次发送数据将分2次发送,第一部分的数据是个信息头大概是这样的结构:
struct HEADER
{
INT nLength;
INT nType;
...
};
第一次调用send将发送这个结构给服务器端,告诉服务器接下来要接收的字节数。

第二部分是一个长度为第一个结构中nLength指定大小的一个数组,pData[nLength];。
第二次调用send将这个数组发送给服务端。

我想使用select模型。

我的问题是:
是不是我每次调用send之前都要调用一次select检查sokect的可写性?如果我不检查就调用send,是不是send就变成了阻塞模式了?如果是,那么我只在connect之后调用一次select可不可以?

实际应用中,我这两种方法都试过了,从效率和传输稳定性上看不出什么区别,希望牛人为我指路。谢谢。

...全文
296 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
annvily 2008-07-07
  • 打赏
  • 举报
回复
可以设置一个全局变量来控制
BOOL g_bAccept;

g_bAccept= TRUE;

while(g_bAccept)
{
...
}

当想跳出线程时,设置:
g_bAccept= FALSE;
让他自己退出
cnzdgs 2008-07-06
  • 打赏
  • 举报
回复
当未执行select就直接send时,如果socket是阻塞模式(默认),有可能阻塞,应该每次send前都调用select;如果socket设置了非阻塞模式,则不会阻塞,当数据不能立即发送时会返回失败,WSAGetLastError错误码是WSAEWOULDBLOCK。
通过closesocket可以使线程从accept中返回,不过你的循环中应该加入判断跳出循环。
guopo 2008-07-06
  • 打赏
  • 举报
回复
还有一个问题就是:
如果我开一个线程,在这个线程中循环调用accept();

UINT AcceptThread( VOID *lpParam )
{
...
while( TRUE )
{

SOCKET sAcceptSocket = accept(..);
...
}
}

由于accept是阻塞的,如果我想终止这个线程,难道只能TerminateThread()吗?还有更好的方法来实现吗?
zhengq06 2008-07-06
  • 打赏
  • 举报
回复
学习。 帮顶。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧