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 了,还是直接计算有多少数据发多少数据
