为什么客户端说发送数据正确了,也返回了正确的数据大小,而服务器端就是接不到数据呢,总是说连接已经关闭了!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;
}

解决方案 »

  1.   


    AfxBeginThread(ClientThread, &client);
    改成
    AfxBeginThread(ClientThread, client);或将 ClientThread 中的
    SOCKET client = (SOCKET)lpParam;
    改成
    SOCKET client = (SOCKET)*lpParam;
      

  2.   

    你可能关闭服务器端的socket太快了。你把nClose = closesocket(client);去掉看看。
      

  3.   


    AfxBeginThread(ClientThread, &client);
    改成
    AfxBeginThread(ClientThread, client);就编译不过去了。
      

  4.   

    AfxBeginThread(ClientThread,(LVOID) client);
      

  5.   

    AfxBeginThread(ClientThread,(LPVOID) client);
      

  6.   

    应该也不是socket关闭太快的问题,我在客户端发送数据后加了一个::Sleep(5000);也不行。
      

  7.   

    我没试代码肉眼观察了一下,从很多控制程序错误的代码来看,可能是连接上的问题,甚至SOCKET 根本没有连通。换个端口试试?
    还有就是想问你服务器端的代码    listen(server,10) 是什么意思?
      

  8.   

    UINT ClientThread(LPVOID lpParam):
    SOCKET client = (SOCKET)lpParam; 改为SOCKET* client = (SOCKET *)lpParam;
    下面凡是出现client的地方,改为*client
    就可以了
      

  9.   

    UINT ClientThread(LPVOID lpParam)
    {
    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;
    }
      

  10.   

    谢谢大家!我按zfive5(醉马Ⅴ) 的方法改成AfxBeginThread(ClientThread,(LPVOID) client);的确可以收到数据了,但是为什么总是收不全收据?而recv的返回值确是正确的。我将ClientThread线程改了一下,又加了几个输出。服务器端没变,请大家帮我看看是怎么回事。
    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个字节,和返回值不一样呢?
      

  11.   

    // clienttest.cpp
    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);
    }