求助!c++ tcp send发数据,服务端接受不到,客户端关掉程序,服务端才能接收到??
//启动服务
void MySocket::StartServer()
{
DWORD myMainThreadID=::GetCurrentThreadId(); //获取当前线程也就是主线程的ID号
static ThreadParameter tp;//此处需设置为静态变量
tp.MainThreadID=myMainThreadID;
HANDLE hThread = CreateThread(NULL,0,StartAcceptThread,(LPVOID)&tp,0,NULL);//创建新线程
CloseHandle(hThread);
}
//线程的启动函数
DWORD WINAPI MySocket::StartAcceptThread(LPVOID lpData)
{
ThreadParameter tp=*((ThreadParameter *)lpData);
int nServAddlen = sizeof(servAddr);
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
MessageBox(NULL,L"网络连接失败",L"Title(标题)",MB_OK);
return 1;
}
//创建套接字
sHost = socket(AF_INET, SOCK_STREAM, 0);
if(INVALID_SOCKET == sHost)
{
MessageBox(NULL,L"网络连接失败",L"Title(标题)",MB_OK);
cout << "socket failed!" << endl;
WSACleanup();//释放套接字资源
return 1;
}
//设置服务器地址
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr(CLIENT_HOST);
servAddr.sin_port = htons((short)CLIENT_PORT);
int sndbuf=0; /* Send buffer size */
//在发送数据的时,不执行由系统缓冲区到socket缓冲区的拷贝,以提高程序的性能
setsockopt( sHost, SOL_SOCKET, SO_SNDBUF, ( char * )&sndbuf, sizeof( sndbuf ) );
BOOL bNodelay = TRUE;
setsockopt( sHost, SOL_SOCKET, TCP_NODELAY, ( char* )&bNodelay, sizeof( BOOL ) );
//unsigned long on = 1;
// ioctlsocket(sHost, FIONBIO, &on);//将套接字设为非阻塞,on=1为非阻塞,on=0阻塞
//连接服务器
retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
{
cout << "connect failed!" << endl;
MessageBox(NULL,L"网络连接失败",L"Title(标题)",MB_OK);
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
isFirst=true;//连接成功
receiveServerMessage(tp);//循环接收服务端发来的消息
return 1;
}
void MySocket:: MessageWillSend()
{
static ThreadParameter ctp;//此处需设置为静态变量
DWORD myMainThreadID=::GetCurrentThreadId(); //获取当前线程也就是主线程的ID号
ctp.MainThreadID=myMainThreadID;
HANDLE hThread = CreateThread(NULL,0,sendMessageThread,(LPVOID)&ctp,0,NULL);//创建新线程
CloseHandle(hThread);
}
//发送数据线程
DWORD WINAPI MySocket:: sendMessageThread(LPVOID lpData)
{
//判断是否连接成功
if(!isFirst)
{
MessageBox(NULL,L"网络连接失败",L"Title(标题)",MB_OK);
return 1;
}
ThreadParameter tp=*((ThreadParameter *)lpData);
EnterCriticalSection(&cs);//加锁
//向服务器发送数据
ZeroMemory(buf, BUF_SIZE);
string pp=MyTool:: UnicodeToUTF8(data);
strcpy(buf,pp.c_str());
ZeroMemory(data, BUF_SIZE);
LeaveCriticalSection(&cs);//解锁
retVal = send(sHost, buf, strlen(buf)+1, 0);
if (SOCKET_ERROR == retVal)
{
cout << "send failed!" << endl;
MessageBox(NULL,L"网络连接失败",L"Title(标题)",MB_OK);
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
return 1;
}
//接受数据线程
void receiveServerMessage(ThreadParameter tp)
{
while(true)
{
ZeroMemory(bufRecv, BUF_SIZE);
size_t len =strlen(bufRecv)+1;
//iResult = recv(sHost, bufRecv, BUF_SIZE, 0);
if (recv(sHost,bufRecv,BUF_SIZE,0) == SOCKET_ERROR){
int id = WSAGetLastError();
switch (id)
{
case WSANOTINITIALISED:
printf("not initialized\n");
break;
case WSASYSNOTREADY:
printf("sub sys not ready\n");
break;
case WSAHOST_NOT_FOUND:
printf("name server not found\n");
break;
case WSATRY_AGAIN:
printf("server fail\n");
break;
case WSANO_RECOVERY:
printf("no recovery\n");
break;
case WSAEINPROGRESS:
printf("socket blocked by other prog\n");
break;
case WSANO_DATA:
printf("no data record\n");
break;
case WSAEINTR:
printf("blocking call canciled\n");
break;
case WSAEPROCLIM:
printf("limit exceeded\n");
break;
case WSAEFAULT:
printf("lpWSAData in startup not valid\n");
break;
case WSAECONNRESET:
MessageBox(NULL,L"服务端关闭连接",L"Title(消息提示)",MB_OK);
break;
default:
break;
};
return;//退出线程
};
wchar_t * msg=MyTool::UTF8ToUnicode(bufRecv);
wcout.imbue(locale("chs"));
copyData(msg);
//线程间通讯
if(PostThreadMessage(tp.MainThreadID,WM_PARTY_MSG,0,(LPARAM)bufRecv)==0)
{
}
}
}