socket有关问题,百思不得其解

socket问题,百思不得其解服务器端:#pragma comment(lib,ws2_32)#include iostream#include winsock2.

socket问题,百思不得其解
服务器端:


#pragma comment(lib,"ws2_32")
#include "iostream"
#include "winsock2.h"
#include "windows.h"
using namespace std;

BOOL main(void)
{
WSADATA data;
SOCKET nListen,nAccept;
char buffer[1000]="";
if(WSAStartup(MAKEWORD(2,2),&data)==INVALID_SOCKET)
{
cout<<"The SOCKET is Startup Error,the Result is:"<<GetLastError()<<endl;
return FALSE;
}
nListen=socket(AF_INET,SOCK_STREAM,0);
if(nListen==SOCKET_ERROR)
{
        cout<<"The SOCKET is Create Error,the Result is:"<<GetLastError()<<endl;
closesocket(nListen);
WSACleanup();
return FALSE;
}
    SOCKADDR_IN myaddr;
myaddr.sin_port=htons(3000);
myaddr.sin_family=AF_INET;
myaddr.sin_addr.S_un.S_addr=INADDR_ANY;
if(bind(nListen,(SOCKADDR*)&myaddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
        cout<<"The SOCKET is Bind Error,the Result is:"<<GetLastError()<<endl;
closesocket(nListen);
WSACleanup();
return FALSE;
}
if(listen(nListen,10)==SOCKET_ERROR)
{
        cout<<"The SOCKET is Listen Error,the Result is:"<<GetLastError()<<endl;
closesocket(nListen);
WSACleanup();
return FALSE;
}
SOCKADDR_IN ClientAddr;
        int AcceptLeng=sizeof(SOCKADDR_IN);
nAccept=accept(nListen,(SOCKADDR*)&ClientAddr,&AcceptLeng);
if(nAccept==SOCKET_ERROR)
{
        cout<<"The SOCKET is accept Error,the Result is:"<<GetLastError()<<endl;
closesocket(nListen);
WSACleanup();
return FALSE;
}
while(1)
{
    int RecvFlag=recv(nAccept,buffer,1000,0);
    if(RecvFlag==0||RecvFlag==SOCKET_ERROR)
{
                 cout<<"Recv is error,result is"<<GetLastError()<<endl;
                 break;
}
cout<<buffer<<endl;
}
shutdown(nAccept,SD_RECEIVE);
closesocket(nListen);
closesocket(nAccept);
WSACleanup();
return TRUE;



}



客户端:


为什么啊,客户端输入一行,服务器端显示两行,第二行还是乱码,明明只有1个cout,百思不得其解,麻烦各位指导下
[解决办法]
客户端在while(1)中不停的发
[解决办法]
int RecvFlag=recv(nAccept,buffer,1000,0);
        if(RecvFlag==0
------解决方案--------------------


RecvFlag==SOCKET_ERROR)
        {
                 cout<<"Recv is error,result is"<<GetLastError()<<endl;
                 break;
        }
buffer[RecvFlag] = '\0';
        cout<<buffer<<endl;
[解决办法]
客户端程序:第39行代码 send(nClient,buffer,sizeof(buffer),0)
多发送的一个字节 内容不可预知
[解决办法]
就是楼上的说法
[解决办法]

       if(send(nClient,buffer,sizeof(buffer)+1,0)==SOCKET_ERROR)
        {
            cout<<"Send is error,result is:"<<GetLastError()<<endl;
            break;
        }

sizeof(buffer) + 1 = 1001, 越界了。
[解决办法]
是的。发送的东西太多了。而且服务器端,recv的buff在接收之前没有初始化。导致里面有不可预知的内容。
[解决办法]
send(nClient,buffer,sizeof(buffer)+1,0)
应该是
send(nClient,buffer,strlen(buffer)+1,0)

注意 sizeof 和 strlen 的区别.
[解决办法]
把BUF清空,注意BUF的大小。
[解决办法]
客户端的send一直在发,另外recv时要在缓冲区结尾加0,这有socket例子:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
send(nClient,buffer,sizeof(buffer)+1,0)
应该是
send(nClient,buffer,strlen(buffer)+1,0)

注意 sizeof 和 strlen 的区别. 

strlen 也不合适,因为 buffer 里面真实数据也有可能包括 \0 ,否则,无法发送 \0 了,还是直接计算有多少数据发多少数据