高手解决,recv重复接受了两次数据
我做了个聊天室程序,把数据接收放在线程里面,但是在服务器端老是接收到客户端的送来的数据打印两次,但是客户端就不会接收到服务器端发送来的数据打印两次
代码如下
服务器端:
#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’
很奇怪,望大家指正!!