解决方案 »
- 关于:《循序渐进实现仿QQ界面(五):半透明窗体与不透明控件》
- 问个关于vc2005 创建和调用DLL的初级问题。
- ListControl如何随着窗口大小的改变而改变
- 救命呀,分都给你了。为什么第二次动态创建FormView后会变成一样的dialog界面?
- 一个菜鸟的打印的问题(100分)在线等
- 改个小错误~~~
- 大家用vc都是c加 sdk还是c++加mfc
- OLEDB 应用者调用OLEDB 提供者 都不用CoCreateInstance?
- 如何交换对话框内两种颜色
- 为什么,两个线程操作时,一个操作正常,另一个却反应缓慢,请指教
- 自己制作的BHO安装时360老是提示 怎么解决
- MFC读取和存储大文件
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
客户端连接后,即server端accept后获取的socket
要被保存下来,这样就可以完成后续的处理。
accept后数据处理必须启用新的工作线程,
在工作线程中循环recv就可以获取该socket的数据。
对于client端,处理很简单,只要socket连接成功后,
发送什么数据都是调用send方法
它只负责处理byte[],至于数据如何解析,完全是业务层的处理;
还有1楼赵老师提示的重点是tcp“粘包“,这是构建tcpserver需要考虑
客户端连接后,即server端accept后获取的socket
要被保存下来,这样就可以完成后续的处理。
accept后数据处理必须启用新的工作线程,
在工作线程中循环recv就可以获取该socket的数据。
对于client端,处理很简单,只要socket连接成功后,
发送什么数据都是调用send方法非常感谢您的解答!!!我在试试,有不懂的话,在请教大家。
非常感谢!!!不过没有懂,。
谁都是从不懂到懂,先读《windows 网络编程》
客户端连接后,即server端accept后获取的socket
要被保存下来,这样就可以完成后续的处理。
accept后数据处理必须启用新的工作线程,
在工作线程中循环recv就可以获取该socket的数据。
对于client端,处理很简单,只要socket连接成功后,
发送什么数据都是调用send方法/////////////////////////////////////////////////////////////////////////////////////////////////////
@xian_wwq 大神,看我新改的代码。有如下问题。
1.客户是可以持续向服务端发送消息 ,但是,服务端接收不到消息 。
2.有时候客户端的程序可能直接死掉。
/////////////////////////////////////////////////////////////////////////////////////////////////////服务端的代码
/**
在头文件中的一个struct
struct uSOCKETPARAM{
SOCKET s;
SOCKADDR_IN addr;
};
*/
uSOCKETPARAM *usp = new uSOCKETPARAM;
while(TRUE)
{
int len = sizeof(clientAddr);
SOCKET client = accept(listenServer,(SOCKADDR*)&clientAddr,&len);
// buff = "发送内容";
usp->s = client;
usp->addr = clientAddr;
CloseHandle(
CreateThread(NULL,0,threadFunc,(LPVOID)usp,0,0)
);
/* recv(client,buff,strlen(buff),0);
cout<<"从"<<inet_ntoa(clientAddr.sin_addr)<<"来的消息:"<<buff << endl;*/
}// 线程函数
DWORD WINAPI threadFunc(LPVOID p)
{
uSOCKETPARAM *usp = (uSOCKETPARAM*)p;
char buff[MAX_PATH];
while(1){
recv(usp->s,buff,strlen(buff),0);
cout<<"从"<<inet_ntoa(usp->addr.sin_addr)<<"来的消息:"<<buff << endl;
}
return 0;
}客户端的代码。
while(TRUE)
{
char buff[MAX_PATH];
sprintf(buff,"这里内容");
send(clientSocket,buff,strlen(buff)+1,0);
}
recv(usp->s,buff,strlen(buff),0); ???新手的通病:不知道strlen()是什么意思。
没错,它是取长度,但是它只能取以'\0'结尾的字符串长度。 你char buff[MAX_PATH];定义后凭什么认定buff[0..MAX_PATH-2]为非0而恰巧buff[MAX_PATH-1] == '\0' ?
recv(usp->s,buff,strlen(buff),0); ???新手的通病:不知道strlen()是什么意思。
没错,它是取长度,但是它只能取以'\0'结尾的字符串长度。 你char buff[MAX_PATH];定义后凭什么认定buff[0..MAX_PATH-2]为非0而恰巧buff[MAX_PATH-1] == '\0' ?
OK,这个问题解决了。但是,又有一个新的问题来了
就是我把客户端的程序关闭了,服务端还在继续打印消息【概念】有点模糊,应该是服务端中的程序应该控制如果客户端退出了,就应该释放线程。。
2. 一个客户端一个线程测试可以,工程应用不行,看看 windows socket 五种IO模型
3.客户端关闭后,socket就会异常,这时候server端就需要对异常进行处理,
退出线程的处理代码在哪里呢?
server端不会智能退出死循环
Thanks,OK。明白了,结算了。