64,643
社区成员
发帖
与我相关
我的任务
分享
//一个接受和发送的线程.
DWORD WINAPI FaAndShou(LPVOID lpParameter)
{
Linjie.Lock();//上锁,这个不知道有什么用处,不过竟然能上锁说明,这
//个线程如果被建立了,就不允许其他线程调用了.就可以专心致志的为这个
//连接进来的用户服务吗? 问题1
int err;
char fanHuiDeXinXi[32] = "";//要发送回去的
char jieShouDaoDeXinXi[32] = "";//接收到的
SOCKET ClientSocket = (SOCKET)(LPVOID)lpParameter;
//循环连接接收和发送了.根据上锁和这里的死循环 从这2点来看,这个线程是不是可以
//定位为 网路所说的,"长连接"? 问题2
while(1){
err = SOCKET_ERROR;
//给jieShouDaoDeXinXi 最后添加个\0,免得给烫烫烫到啊,,,会痛死的.顺便
//把上次接收到的信息清0.
for (int i = 0; (int)strlen(jieShouDaoDeXinXi); i++)
{
jieShouDaoDeXinXi[i] = '\0';
}
//如果err不等于-1,就继续循环等待接收.
//这里的SOCKET_ERRO,就不了解了,它什么时候会出现呢.?用户断开?
//在那断?怎么来判断? 问题3
while (err == SOCKET_ERROR)
{
//接收到的信息赋值给"jieShouDaoDeXinXi",32长度
//如果接收不到,或者用户断开连接了.这里的返回就是等
// 于 SOCKET_ERROR(它的返回就是-1)了吗? 问题4
err = recv(ClientSocket, jieShouDaoDeXinXi, 32, 0);
//----------------------------
//接收到信息(发来的只有1和2和3)
if ((int)(jieShouDaoDeXinXi[0] - '0') == 1)
{
//假设接收到的是1,就给他返回什么什么的...在这里如果数
//据比较多的话.是否在开多个线程,或者执行另一个CPP里的函
//数来操作,等待函数返回的信息 在赋值给 fanHuiDeXinXi 在send 回去? 问题5
send(ClientSocket, fanHuiDeXinXi, strlen(fanHuiDeXinXi), 0);
}
//----------------------------
}//while (err == SOCKET_ERROR)
//如果我把 //---------------------------- 里的代码放到while (err == SOCKET_ERROR)
// 循环体里,就真的成为一个长连接了?
//如果我把while (err == SOCKET_ERROR) 去掉就是短连接了? 问题6
Linjie.Unlock();//解锁
return 0;
}//while(1)
}
int main()
{
//一大堆 SOCKET 版本2.2的代码
//这里listen()的第二个参数,不了解, 20,就是接收20个用户连接.? 问题7
if(listen(m_socket,20)==SOCKET_ERROR) {}
SOCKET AcceptSocket;
while(1) //又来一个死循环.作用是不断的等待用户吗?问题8
{
AcceptSocket=SOCKET_ERROR;
while(AcceptSocket==SOCKET_ERROR)
{
//这里不解,我见有些教程在第二个 第三个参数都给传参.有
//些不传,这里的区别是怎么个回事? 问题9
//AcceptSocket = accept(sock, (struct sockaddr*)&cli_addr, &len);
AcceptSocket=accept(m_socket,NULL,NULL);
}
DWORD dwThreadId;
HANDLE hThread;
hThread=CreateThread(NULL,NULL, FaAndShou,
(LPVOID)AcceptSocket,0,&dwThreadId);
if(hThread==NULL)
{
printf("CreatThread AnswerThread() failed.\n");
}
else
{
printf("CreateThread OK.\n");
}
}
//在最后.我也见过有些教程使用关闭和清理.如果使用长连接.以下2个函数可以不使用吗? 问题10
//关闭
closesocket(sock);
//释放
WSACleanup();
}