为什么客户端说发送数据正确了,也返回了正确的数据大小,而服务器端就是接不到数据呢,总是说连接已经关闭了!recv返回-1,这是为什么啊?痛苦死我了!Server 的代码如下:// server_mfc.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "server_mfc.h"
#include <winsock2.h>#pragma comment(lib, "WS2_32")#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// The one and only application objectCWinApp theApp;using namespace std;UINT ClientThread(LPVOID lpParam);int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; WSADATA wsaData;
SOCKET server = NULL;
SOCKET client; struct sockaddr_in local;
struct sockaddr_in from;
int fromlen = sizeof(from); // initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// Initialize Windows Socket
if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0)
{
printf("Socket init error: %d!\r\n", WSAGetLastError());
return -1;
} // Create server socket
server = socket(AF_INET, SOCK_STREAM, 0); if (server == INVALID_SOCKET)
{
printf("Socket create error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} // Bind first IP
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons((USHORT)80); if (bind(server, (sockaddr*)&local, sizeof(local)) != 0)
{
printf("Bind error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} // Listen TCP server with port 80
if (listen(server, 10) != 0)
{
printf("Listen error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} while (true)
{
client = accept(server, (sockaddr*)&from, &fromlen); if (client == INVALID_SOCKET)
{
printf("Accept error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} AfxBeginThread(ClientThread, &client);
}
} return nRetCode;
}UINT ClientThread(LPVOID lpParam)
{
int nRead, nClose;
char szTemp[100];
char szBuff[1024]; SOCKET client = (SOCKET)lpParam;
memset(szBuff, 0, sizeof(szBuff)); do
{
memset(szTemp, 0, sizeof(szTemp));
nRead = recv(client, szTemp, 100, 0); if (nRead == SOCKET_ERROR)
{
printf("Recv error: %d!\r\n", WSAGetLastError());
nClose = closesocket(client); return -1;
} strcat(szBuff, szTemp);
printf("nRead: %d\r\n", nRead); } while (nRead != 0); nClose = closesocket(client); printf("Recv String: %s String Length: %d\r\n", szBuff, strlen(szBuff));
printf("nClose: %d\r\n", nClose); return 0;
}Client 的代码如下:// clienttest.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <winsock2.h>#pragma comment(lib, "WS2_32")
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET client; struct sockaddr_in server; char szBuff[] = "aaa"; int nWrote, nCount;
int nBufflen;
int nClose; nCount = 0; // Initialize Windows Socket
if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0)
{
printf("Socket init error: %d!\r\n", WSAGetLastError());
return -1;
}
// Create server socket
client = socket(AF_INET, SOCK_STREAM, 0); if (client == INVALID_SOCKET)
{
printf("Socket create error: %d!\r\n", WSAGetLastError());
WSACleanup(); return -1;
} server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons((USHORT)80); if (connect(client, (struct sockaddr*)&server, sizeof(server)) != 0)
{
printf("Connect error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} for (int i = 0; i <= 2; i++)
{
nWrote = send(client, szBuff, sizeof(szBuff), 0); if (nWrote == SOCKET_ERROR)
{
printf("Send error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} nBufflen = sizeof(szBuff); if (nWrote != nBufflen)
{
printf("Send size error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} printf("nWrote: %d\r\n", nWrote);
nCount += nWrote;
} nClose = closesocket(client);
WSACleanup(); printf("Sent Length: %d\r\n", nCount);
printf("nClose: %d\r\n", nClose); return 0;
}
//#include "stdafx.h"
#include "server_mfc.h"
#include <winsock2.h>#pragma comment(lib, "WS2_32")#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// The one and only application objectCWinApp theApp;using namespace std;UINT ClientThread(LPVOID lpParam);int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; WSADATA wsaData;
SOCKET server = NULL;
SOCKET client; struct sockaddr_in local;
struct sockaddr_in from;
int fromlen = sizeof(from); // initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// Initialize Windows Socket
if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0)
{
printf("Socket init error: %d!\r\n", WSAGetLastError());
return -1;
} // Create server socket
server = socket(AF_INET, SOCK_STREAM, 0); if (server == INVALID_SOCKET)
{
printf("Socket create error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} // Bind first IP
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons((USHORT)80); if (bind(server, (sockaddr*)&local, sizeof(local)) != 0)
{
printf("Bind error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} // Listen TCP server with port 80
if (listen(server, 10) != 0)
{
printf("Listen error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} while (true)
{
client = accept(server, (sockaddr*)&from, &fromlen); if (client == INVALID_SOCKET)
{
printf("Accept error: %d!\r\n", WSAGetLastError());
closesocket(server);
server = NULL;
WSACleanup(); return -1;
} AfxBeginThread(ClientThread, &client);
}
} return nRetCode;
}UINT ClientThread(LPVOID lpParam)
{
int nRead, nClose;
char szTemp[100];
char szBuff[1024]; SOCKET client = (SOCKET)lpParam;
memset(szBuff, 0, sizeof(szBuff)); do
{
memset(szTemp, 0, sizeof(szTemp));
nRead = recv(client, szTemp, 100, 0); if (nRead == SOCKET_ERROR)
{
printf("Recv error: %d!\r\n", WSAGetLastError());
nClose = closesocket(client); return -1;
} strcat(szBuff, szTemp);
printf("nRead: %d\r\n", nRead); } while (nRead != 0); nClose = closesocket(client); printf("Recv String: %s String Length: %d\r\n", szBuff, strlen(szBuff));
printf("nClose: %d\r\n", nClose); return 0;
}Client 的代码如下:// clienttest.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <winsock2.h>#pragma comment(lib, "WS2_32")
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET client; struct sockaddr_in server; char szBuff[] = "aaa"; int nWrote, nCount;
int nBufflen;
int nClose; nCount = 0; // Initialize Windows Socket
if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0)
{
printf("Socket init error: %d!\r\n", WSAGetLastError());
return -1;
}
// Create server socket
client = socket(AF_INET, SOCK_STREAM, 0); if (client == INVALID_SOCKET)
{
printf("Socket create error: %d!\r\n", WSAGetLastError());
WSACleanup(); return -1;
} server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons((USHORT)80); if (connect(client, (struct sockaddr*)&server, sizeof(server)) != 0)
{
printf("Connect error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} for (int i = 0; i <= 2; i++)
{
nWrote = send(client, szBuff, sizeof(szBuff), 0); if (nWrote == SOCKET_ERROR)
{
printf("Send error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} nBufflen = sizeof(szBuff); if (nWrote != nBufflen)
{
printf("Send size error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} printf("nWrote: %d\r\n", nWrote);
nCount += nWrote;
} nClose = closesocket(client);
WSACleanup(); printf("Sent Length: %d\r\n", nCount);
printf("nClose: %d\r\n", nClose); return 0;
}
AfxBeginThread(ClientThread, &client);
改成
AfxBeginThread(ClientThread, client);或将 ClientThread 中的
SOCKET client = (SOCKET)lpParam;
改成
SOCKET client = (SOCKET)*lpParam;
AfxBeginThread(ClientThread, &client);
改成
AfxBeginThread(ClientThread, client);就编译不过去了。
还有就是想问你服务器端的代码 listen(server,10) 是什么意思?
SOCKET client = (SOCKET)lpParam; 改为SOCKET* client = (SOCKET *)lpParam;
下面凡是出现client的地方,改为*client
就可以了
{
int nRead, nClose;
char szTemp[100];
char szBuff[1024]; SOCKET* client2 = (SOCKET *)lpParam;
cout<<client2<<endl;
//////////////////////////
memset(szBuff, 0, sizeof(szBuff)); do
{
memset(szTemp, 0, sizeof(szTemp));
nRead = recv(*client2, szTemp, 100, 0); if (nRead == SOCKET_ERROR)
{
printf("Recv error: %d!\r\n", WSAGetLastError());
nClose = closesocket(*client2); return -1;
} strcat(szBuff, szTemp);
printf("nRead: %d\r\n", nRead); } while (nRead != 0); nClose = closesocket(*client2); printf("Recv String: %s String Length: %d\r\n", szBuff, strlen(szBuff));
printf("nClose: %d\r\n", nClose); return 0;
}
UINT ClientThread(LPVOID lpParam)
{
int nRead, nClose;
char szTemp[100];
char szBuff[1024]; SOCKET client = (SOCKET)lpParam;
memset(szBuff, 0, sizeof(szBuff)); do
{
memset(szTemp, 0, sizeof(szTemp));
nRead = recv(client, szTemp, 100, 0); if (nRead == SOCKET_ERROR)
{
printf("Recv error: %d!\r\n", WSAGetLastError());
nClose = closesocket(client); return -1;
} strcat(szBuff, szTemp);
printf("nRead: %d String: %s\r\n", nRead, szTemp); } while (nRead != 0); nClose = closesocket(client); printf("nClose: %d\r\n", nClose);
printf("Recv String: %s String Length: %d\r\n", szBuff, strlen(szBuff));
printf("-----------------------------------------\r\n", nClose); return 0;
}测试输出的结果是:D:\server_mfc\Debug>server_mfc.exe
nRead: 8 String: aaa
nRead: 4 String: aaa
nRead: 0 String:
nClose: 0
Recv String: aaaaaa String Length: 6
-----------------------------------------
nRead: 12 String: aaa
nRead: 0 String:
nClose: 0
Recv String: aaa String Length: 3
-----------------------------------------为什么每次接收到的只是一个"aaa",3个字节,和返回值不一样呢?
for循环里,加个Sleep(1000);
前面用我的方法也可以解决
for (int i = 0; i <= 2; i++)
{
nWrote = send(client, szBuff, sizeof(szBuff), 0); if (nWrote == SOCKET_ERROR)
{
printf("Send error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} nBufflen = sizeof(szBuff); if (nWrote != nBufflen)
{
printf("Send size error: %d!\r\n", WSAGetLastError());
closesocket(client);
WSACleanup(); return -1;
} printf("nWrote: %d\r\n", nWrote);
nCount += nWrote;
Sleep(1000);
}