需求,用執行緒開啟一個服務端,每接到客戶端發送的資料回傳一條資料
問題,客戶端連接斷開之后就連不上服務端了,必須重新啟動服務端才行
DWORD WINAPI SrvThread(LPVOID lpParam)
{
// TODO: Add your control notification handler code here
WSADATA wsaData;
int port = 50005; //埠
CString A0001Str,A0002Str,Errstr;
char sendA0001[1024],sendA0002[1024],recvbuf[1024]; //發送與接收資料緩沖區
while(1)
{
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
Errstr.Format("%d",WSAGetLastError());
pDcvp ->WriteLog("服務器創建失敗,錯誤代碼:"+Errstr);
continue;
}
//創建用于監聽的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(port); //1024以上的埠號
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN));
if(retVal == SOCKET_ERROR){
Errstr.Format("%d",WSAGetLastError());
pDcvp ->WriteLog("錯誤代碼:"+Errstr);
continue;
}
if(listen(sockSrv,10) ==SOCKET_ERROR){
Errstr.Format("%d",WSAGetLastError());
pDcvp ->WriteLog("錯誤代碼:"+Errstr);
continue;
}
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
SOCKET sockConn;
sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len);
while(sockConn != INVALID_SOCKET)
{
//接收資料
memset(recvbuf, 0, sizeof(recvbuf));
if(recv(sockConn, recvbuf, sizeof(recvbuf), 0) == SOCKET_ERROR)
{
Errstr.Format("%d",WSAGetLastError());
pDcvp ->WriteLog("接收資料出錯,錯誤代碼2:"+Errstr);
continue;
}
strcpy(sendA0001, A0001Str);
if(!strcmp("A0001",recvbuf))
{
//發送資料
if(send(sockConn, sendA0001, sizeof(sendA0001), 0) == SOCKET_ERROR)
{
Errstr.Format("%d",WSAGetLastError());
pDcvp ->WriteLog("發送A0001出錯,錯誤代碼:"+Errstr);
continue;
}
}
else if(!strncmp("A0002",recvbuf,5))
{
memset(sendA0002, 0, sizeof(sendA0002));
strcpy(sendA0002, A0002Str);
//發送資料
if(send(sockConn, sendA0002, sizeof(sendA0002), 0) == SOCKET_ERROR)
{
//sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len);
Errstr.Format("%d",WSAGetLastError());
pDcvp ->WriteLog("發送A0002出錯,錯誤代碼:"+Errstr);
continue;
}
}
}
if(sockConn!=INVALID_SOCKET)
{
closesocket(sockConn);
sockConn = INVALID_SOCKET;
}
closesocket(sockSrv);
WSACleanup();
}
return 0;
uj5u.com熱心網友回復:
不知道有多少前人掉在TCP Socketsend(人多)send(病少)send(財富)
recv(人多病)recv(少財富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
uj5u.com熱心網友回復:
代碼邏輯不對, 學會除錯看錯在哪轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/121811.html
標籤:基礎類
