在线程里accept为什么不阻塞? 在一个线程函数里accept,结果并不阻塞,怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是你生成的不是阻塞的socket? socket() function 的参数决定了阻塞与否, 你设置成什么了?? socket()的参数决定阻塞与否?不对吧serverFD = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(19999); server.sin_addr.s_addr=ADDR_ANY; int ret=bind(serverFD,(sockaddr *)&server,sizeof(server)); ret=listen(serverFD,4); int iSize = sizeof(server); SOCKET clientFD=accept(serverFD,(sockaddr *)&server,&iSize);结果正常情况下阻塞,放到线程函数里就不阻塞了 UINT ThreadProc(LPVOID pPara){ Info *fo; fo = (Info*)pPara; int nSize = sizeof(fo->server); SOCKET s = accept(fo->s, (sockaddr*) &fo->server,&nSize); char buffer[100]; ZeroMemory(buffer,100); recv(s, buffer,100,0); AfxMessageBox(buffer); return 0;}void CSockThreadDlg::OnButton1() { // TODO: Add your control notification handler code here WSADATA wsa; WSAStartup(MAKEWORD(2,2), &wsa); SOCKET saServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in server; server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr("172.29.90.96"); server.sin_port = htons(17777); int iResult = bind(saServer, (sockaddr*)&server,sizeof(server)); iResult = listen(saServer,5); Info fo; fo.s = saServer; fo.server = server; AfxBeginThread(ThreadProc,&server); }一按下BUTTON1,就弹出一个消息框,消息框内容是空白,按道理应该在线程函数里阻塞,等到有客户端连接上来后发送了消息才会弹出对话框, typedef struct Info{ SOCKET s; struct sockaddr_in server;}; Info fo;你的这个定义是局部的,等到线程中后,那个地址中的数据已经不存在了,建议把fo写成类成员,或是全局变量。 AfxBeginThread(ThreadProc,&server);??AfxBeginThread(ThreadProc,&fo);因为在线程函数中:Info *fo;fo = (Info*)pPara; FAINT是我自己代码写错了应该是AfxBeginThread(ThreadProc,&fo);搞定 开机启动的话,不用注册表,如何实现? MFC 单文档、多文档工具栏图标问题 VC 中的DDX 和 DDV 有逻辑漏洞 如何实现3389那样的桌面?不好意思,我只有10分了,给点思路也好。 菜鸟请教高手:在VC+ADO编制数据库时,如何传递变量值? 有关Winsock的问题 QQ下的User.db文件怎样打开? CSocket 与 CSocketFile 如何建立关系,CSocketFile 内容修改,CSocket自动接收? 怎么调试COM啊 vc能接入3dmax设计的造型么,能让其行动么?应该怎么实现呢? 关于unicode的问题 简单问题关于MSComm控件
struct sockaddr_in server; server.sin_family = AF_INET;
server.sin_port = htons(19999);
server.sin_addr.s_addr=ADDR_ANY;
int ret=bind(serverFD,(sockaddr *)&server,sizeof(server));
ret=listen(serverFD,4);
int iSize = sizeof(server); SOCKET clientFD=accept(serverFD,(sockaddr *)&server,&iSize);结果正常情况下阻塞,放到线程函数里就不阻塞了
{ Info *fo;
fo = (Info*)pPara; int nSize = sizeof(fo->server); SOCKET s = accept(fo->s, (sockaddr*) &fo->server,&nSize); char buffer[100];
ZeroMemory(buffer,100); recv(s, buffer,100,0);
AfxMessageBox(buffer);
return 0;
}void CSockThreadDlg::OnButton1()
{
// TODO: Add your control notification handler code here WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
SOCKET saServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("172.29.90.96");
server.sin_port = htons(17777);
int iResult = bind(saServer, (sockaddr*)&server,sizeof(server));
iResult = listen(saServer,5); Info fo;
fo.s = saServer;
fo.server = server; AfxBeginThread(ThreadProc,&server);
}一按下BUTTON1,就弹出一个消息框,消息框内容是空白,按道理应该在线程函数里阻塞,等到有客户端连接上来后发送了消息才会弹出对话框,
{
SOCKET s;
struct sockaddr_in server;
};
你的这个定义是局部的,等到线程中后,那个地址中的数据已经不存在了,建议把fo写成类成员,或是全局变量。
AfxBeginThread(ThreadProc,&fo);
因为在线程函数中:
Info *fo;
fo = (Info*)pPara;
是我自己代码写错了应该是
AfxBeginThread(ThreadProc,&fo);搞定