高手解决,recv重复接受了两次数据

lishaoyu 2010-05-21 08:57:27
我做了个聊天室程序,把数据接收放在线程里面,但是在服务器端老是接收到客户端的送来的数据打印两次,但是客户端就不会接收到服务器端发送来的数据打印两次
代码如下
服务器端:

#include<stdio.h>
#include<Winsock2.h>
#include<Windows.h>
DWORD WINAPI RecvProc(
LPVOID lpParameter // thread data
);
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}

/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}

SOCKET sockt=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr_in;
addr_in.sin_family=AF_INET;
addr_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addr_in.sin_port=htons(6000);

bind(sockt,(SOCKADDR*)&addr_in,sizeof(SOCKADDR));

listen(sockt,5);
SOCKET clientSocket;
SOCKADDR_IN clientAddr;
int len=sizeof(SOCKADDR);

clientSocket=accept(sockt,(SOCKADDR*)&clientAddr,&len);
DWORD threadId=0;
HANDLE hTread=CreateThread(NULL,0,RecvProc,&clientSocket,0,&threadId);
while(true)
{
printf("请输入数据:\n");
char sendBuf[200];
memset(sendBuf,0,200);
scanf("%s",sendBuf);
send(clientSocket,sendBuf,200,0);

}
CloseHandle(hTread);
}
DWORD WINAPI RecvProc(
LPVOID lpParameter // thread data
)
{
SOCKET skt=*((SOCKET*)lpParameter);
while(true)
{
char recvBuf[200];
memset(recvBuf,0,200);
recv(skt,recvBuf,200,0);
printf("错误代码:%d",WSAGetLastError());
//WSANOTINITIALISED
printf("来自对方%s\n",recvBuf);
}
}


客户端:
#include<stdio.h>
#include<Winsock2.h>
#include<string.h>
#include<Windows.h>
DWORD WINAPI RecvProc(
LPVOID lpParameter // thread data
);
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}

/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}
SOCKET sockt=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr=inet_addr("117.43.93.191");
addr.sin_family=AF_INET;
addr.sin_port=htons(6000);

if(SOCKET_ERROR== connect(sockt,(SOCKADDR*)&addr,sizeof(SOCKADDR)))
{
printf("连接失败!!");
return ;
}
printf("连接成功!");
DWORD threadId=0;
HANDLE hTread=CreateThread(NULL,0,RecvProc,&sockt,0,&threadId);
while(true)
{

printf("请输入数据:\n");
char sendBuf[200];
memset(sendBuf,0,200);
scanf("%s",sendBuf);
getchar();
send(sockt,sendBuf,200,0);
if(SOCKET_ERROR == send(sockt,sendBuf,strlen(sendBuf),0))
{
if(WSAGetLastError()==WSAECONNRESET )
{
printf("远程主机已经下线!");
break;
}

}
}
CloseHandle(hTread);
}
DWORD WINAPI RecvProc(
LPVOID lpParameter // thread data
)
{
SOCKET skt=*((SOCKET*)lpParameter);
while(true)
{
char recvBuf[200];
memset(recvBuf,0,200);
recv(skt,recvBuf,200,0);
printf("来自对方的:%s\n",recvBuf);
}
}

当我在客户端输入一个‘g’的时候
在服务器端会接受两个‘g’
很奇怪,望大家指正!!
...全文
679 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lishaoyu 2010-05-22
  • 打赏
  • 举报
回复
呵呵,谢谢各位的参与,其实我犯了一个很低级的错误,我在客户端while(true)里面调用了两次send,当然会在服务器端重复两次数据了,很低级的错误啊,太粗心了,谢谢各位的参与讨论!!结贴了。
lishaoyu 2010-05-21
  • 打赏
  • 举报
回复
那应该怎么改呢?麻烦指正下,谢谢!!
尹成 2010-05-21
  • 打赏
  • 举报
回复
当 SEND() 发第一条数据,如果想发 第二条数据时,必须 收到 第一条数据已经收到的 确认 消息。
这样RECV() 就可以 每次 收到 一条 数据
lishaoyu 2010-05-21
  • 打赏
  • 举报
回复
我就是,在客户端输入一个g,然后按enter健,
在服务器端就显示两行g,每行一个g字母,就是这样的。
ljz888666555 2010-05-21
  • 打赏
  • 举报
回复
单步跟踪下,客户端怎么发的,

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧