首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

待:socket中send和recv的迷惑

2012-03-17 
在线等待:socket中send和recv的迷惑小弟想写一个简单的socket程序,实现客户端到服务端的简单通信,服务端和

在线等待:socket中send和recv的迷惑
小弟想写一个简单的socket程序,实现客户端到服务端的简单通信,服务端和客户端都是通一台机器,大概功能是:
客户和服务器连接后,
1、服务端发送“Hello,Welcome to server”给客户端并打印
2、客户端收到欢迎消息,再发送ip地址给服务器
3、服务端打印客户发来的ip地址“172.168.2.23 is connected”,假设客户端ip地址是172.168.2.23



服务端主要代码:
while(1)
{

SOCKET sockconn=accept(sockSvr,(sockaddr *)&addrClient,&len);


sprintf(sendBuf,"Hello,Welcome to server"); 
send(sockconn,sendBuf,strlen(sendBuf)+1,0); //发送欢迎消息给客户端

recv(sockconn,revBufs,12,0); //准备接收客户端发过来的ip地址

printf("%s is connected\n",revBufs); //打印客户端地址

closesocket(sockconn);
}


客户端主要代码:
SOCKET sockClint=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
addrSrv.sin_addr.S_un.S_addr=inet_addr("172.168.2.23");


connect(sockClint,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char revBuf[100];
recv(sockClint,revBuf,100,0);
printf("%s\n",revBuf); //打印欢迎消息

hostent* host = gethostbyname("");
char *lpIP = inet_ntoa(*(struct in_addr*)*(host->h_addr_list)); //获取本机ip地址


char ips[13];
for(int i=0;i<12;i++)
ips[i]=*(lpIP+i); //将ip地址放到一个数组,
ips[i]='\0';  

send(sockClint,ips,sizeof(ips),0); //发送装有客户端ip的数组
closesocket(sockClint);
WSACleanup();


客户端窗口收到了主机发过来的信息
Hello,Welcome to server

但服务端显示为:
172.168.2.23Hello,Welcome to server is connected
而我希望的是172.168.2.23 is connected,
为什么是这样的结果呢,貌似服务端发的消息又被服务端收到了,这明明是发给客户端的
调试的时候发现:服务端得revBufs数组放的数据就是172.168.2.23Hello,Welcome to server is connected,
请大侠们帮忙看一看??

[解决办法]
recv(sockconn,revBufs,12,0);前加一句memset(revBufs,0,sizeof(revBufs));
[解决办法]

探讨

感谢oniisama,程序通了,但我搞不明白,是不是send和recv在维护一个队列,而清理工作得交给程序员,而导致我上述原因是因为发送了数据还没有被取走,客户端ip信息就发到队列来了,等recv来取,等于是取了2次send发的数据,服务端和客户端各一次,如果这样的话,那岂不是每次都要清理一下内存呢?

热点排行