这是SOCKET 的短连接?长连接?

林老伯咯 2015-07-20 12:14:28
直接上代码,都在注释了,大家看看.我读代码的思路是不是对的.有些带问号的,麻烦大婶们帮回下.



//一个接受和发送的线程.
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();

}



不好意思,看到这里,让大婶们辛苦了.
我也是无奈.新手,之所以能问出以上的问题,也是很无奈.
在多线程来说.不知道如何来做测试.
以上写PHP的时候,直接在网页上一刷新就知道问题.C++还真的无奈.
麻烦大家帮忙看看了.

以上的代码是准备用来做一个棋牌游戏的服务端的.
...全文
81 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_dragon_fly 2015-07-20
  • 打赏
  • 举报
回复
短连, 收到数据就退出了
sandshaw 2015-07-20
  • 打赏
  • 举报
回复
关于长短socket: http://blog.csdn.net/wanghuan203/article/details/36057485 看看这个你会更清楚
sandshaw 2015-07-20
  • 打赏
  • 举报
回复
1. 上锁是为了防止多线程冲突. 2. 不是长连接, 长连接需要维持. 3. 15行初始化的. while循环里可能出现. 作为一个判断 4. 对 5. 可以. 6. 不是 7. 第二个参数是你监听客户端的最大个数,如连接到主机上的客户端超过其数listen则会返回一个错误代号。至于队列放在哪可以不关心,可以认为是一个缓冲区。 8. ...... 9. addr参数为一个返回参数,其中填写的是为通讯层所知的连接实体地址。addr参数的实际格式由通讯时产生的地址族确定.addrlen参数也是一个返回参数,在调用时初始化为addr所指的地址空间;在调用结束时它包含了实际返回的地址的长度(用字节数表示).该函数与SOCK_STREAM类型的面向连接的套接口一起使用.如果addr与addrlen中有一个为零NULL,将不返回所接受的套接口远程地址的任何信息. 10 不管长短, 在不使用socket资源的时候, 都要调用这两个函数. 这是短链接....
wenxinfly 2015-07-20
  • 打赏
  • 举报
回复
长连接,while一直在运行,

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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