用TCP编一个简单C/S 连接通信!
要求,服务器在接到客户端的信息"Hello SERVER!"后,在信息头加"ServerDemo!“再返回客户端;
只有服务器收到客户端的数据,客户端没收的服务器返回的数据!郁闷啊!各位有空的大大帮忙看看,谢谢啦!
sever程序如下:// Sever.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>#pragma comment(lib,"WS2_32.lib") //pragma 编译指示,comment 注释;int main(int argc, char* argv[])
{
WSADATA wsaData;
    WORD sockVersion=MAKEWORD(2,0);
    WSAStartup(sockVersion,&wsaData);

    SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
{
printf("Failed Socket!\n");
WSACleanup();
return 0;
} sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(8888);
sin.sin_addr.S_un.S_addr=INADDR_ANY;
if(bind(s,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("Failed bind()\n");
WSACleanup();
return 0;
} if(listen(s,2)==SOCKET_ERROR)
{
printf("Failde Listen()!\n");
WSACleanup();
return 0;
} sockaddr_in remoteAddr;
int nAddrLen=sizeof(remoteAddr);
::SOCKET client;
char szText[256]="10ServerDemo! ";
char buf[256];
while(true)
{
client=accept(s,(SOCKADDR*)&remoteAddr,&nAddrLen);
if(client==INVALID_SOCKET)
{
printf("Failed Accept()!\n");
continue; }
printf("接受一个连接:%s\r\n",::inet_ntoa(remoteAddr.sin_addr));
int nRecv=recv(client,buf,256,0);
if(nRecv>0)
{
buf[nRecv]='\0';
printf("接受到的数据:%s\n",buf);
}
   
   strcat(szText,buf);
     printf("szText= %s\n",szText);//这里只打印“Hello Server!”
   
send(client,szText,strlen(szText),0);
::closesocket(client);
}

::closesocket(s);
::WSACleanup();
return 0;
}
客户端程序如下:// Client.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>#pragma comment(lib,"WS2_32.lib")
int main(int argc, char* argv[])
{
::WSADATA wsaData;
WORD sockVersion=MAKEWORD(2,0);
::WSAStartup(sockVersion,&wsaData); ::SOCKET s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
{
printf("Failde Socket!\n");
::WSACleanup();
return 0;
} ::sockaddr_in servAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_port=htons(8888);
servAddr.sin_addr.S_un.S_addr=::inet_addr("127.0.0.1");
if(::connect(s,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
printf("connect Failed!\n");
::WSACleanup();
return 0;
}
char buf[256]="Hello SERVER!";
send(s,buf,sizeof(buf),0);

int nRecv=0;
nRecv=::recv(s,buf,256,0);
if(nRecv>0)
{
buf[nRecv]='\0';
printf("接受到的数据:%s\n",buf);//这里既然打印出“Hello Server!”

}


::closesocket(s);

::WSACleanup();
return 0;
}

解决方案 »

  1.   

    看一下客户端返回的nRecv是不是错误,错误了用WSAGetLastError看看错误代码........
      

  2.   

    本帖最后由 wenxy1 于 2008-10-21 10:22:50 编辑
      

  3.   

    // Client.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include <winsock2.h>
    #include <stdio.h>
    #include <windows.h>#pragma comment(lib,"WS2_32.lib")
    int main(int argc, char* argv[])
    {
        ::WSADATA wsaData;
        WORD sockVersion=MAKEWORD(2,0);
        ::WSAStartup(sockVersion,&wsaData);    ::SOCKET s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(s==INVALID_SOCKET)
        {
            printf("Failde Socket!\n");
            ::WSACleanup();
            return 0;
        }    ::sockaddr_in servAddr;
        servAddr.sin_family=AF_INET;
        servAddr.sin_port=htons(8888);
        servAddr.sin_addr.S_un.S_addr=::inet_addr("127.0.0.1");
            if(::connect(s,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
        {
            printf("connect Failed!\n");
            ::WSACleanup();
            return 0;
        }
        char buf[256]="Hello SERVER!";
        
        send(s,buf,sizeof(buf),0);  ////这里错了,应该改成send(s,buf,strlen(buf),0);
        
        int nRecv=0;
        nRecv=::recv(s,buf,256,0);
        if(nRecv>0)
        {
            buf[nRecv]='\0';
            printf("接受到的数据:%s\n",buf);//这里既然打印出“Hello Server!”
            
        }
        
        
        ::closesocket(s);
        
        ::WSACleanup();
        return 0;
    }
      

  4.   

        int nRecv=0;
        nRecv=::recv(s,buf,256,0);
        if(nRecv>0) 
        {
            buf[nRecv]='\0';
            printf("接受到的数据:%s\n",buf);//这里既然打印出“Hello Server!”
            
        }
    //  if(nRecv>0) 表示收到了服务器的数据,但不能保证服务发出的所有数据已经收到。
    // 因此,服务器要告诉client我要发多少数据给你。你自己再修改一下代码。服务器也要改,客户机接收也要改。.
    可参考我帮你改的服务器。
      

  5.   

        char buf[256]="Hello SERVER!";
       
        send(s,buf,sizeof(buf),0);  ////这里错了,应该改成send(s,buf,strlen(buf),0); 
    答:严格说来,这样做有点不合理,因为buf长度为256bytes, send把字符串的'\0'也送了去了。
      

  6.   

    你在客户send后
    hEvent=::CreateEvent(NULL,FALSE,FALSE,NULL);
    ::WSAEventSelect(s,hEvent,FD_READ|FD_CLOSE);
    WaitForSingleObject(hEvent,INFINITE);
    int nRecv=0;
    nRecv=::recv(s,buf,256,0);
    if(nRecv>0)
    {
         buf[nRecv]='\0';
         printf("接受到的数据:%s\n",buf);//这里既然打印出“Hello Server!”      
    }
    CloseHandle(hEvent);
      

  7.   

    我跟搂主有相同的问题,测试你的代码,recv函数总是返回0。下面是MSDN的帮助,不知道到底什么叫“连接被温和的关闭了”
    “If the connection has been gracefully closed, the return value is zero. “