读书人

socket 基于tcp的聊天程序中为什么客户

发布时间: 2012-01-07 21:41:55 作者: rapoo

socket 基于tcp的聊天程序中为什么客户端和服务器端都只能收发一次数据
希望c/s两端轮流发送数据,但都只能发送一次,小弟刚接触网络编程,请大家帮我看看。公司内,在线等.下面是源码,控制台程序:
#include <winsock2.h>
#include <stdio.h>
void main()
{
//装入库文件
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

//。定义套接字
SOCKET socketclient=socket(AF_INET,SOCK_STREAM,0);

//。定义要连接的目的地址并连接
sockaddr_in srvaddr;
srvaddr.sin_addr.S_un.S_addr=inet_addr( "127.0.0.1 ");
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(6000);
int len=sizeof(sockaddr);


connect(socketclient,(sockaddr*)&srvaddr,len);

//。发送数据
char sendbuff[100]= "this is name list ";
char recvbuff[100];
while(1)
{
recv(socketclient,recvbuff,100,0);
printf( "%s ",recvbuff);

//printf( "please input data: ");
//gets(sendbuff);
int i=0;
i=send(socketclient,sendbuff,sizeof(sendbuff),0);
//printf( "i=%d\n ",i);
if(i==SOCKET_ERROR)
{
i=WSAGetLastError();
printf( "err i=%d\n ",i);
}

}//while
closesocket(socketclient);
WSACleanup();
}

==================================
#include <winsock2.h>
#include <stdio.h>

void main()
{
//装入库文件
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

//。定义套接字并绑定
SOCKET socketsrv=socket(AF_INET,SOCK_STREAM,0);

sockaddr_in srvaddr;
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(6000);
srvaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//inet_addr( "127.0.0.1 ");

bind(socketsrv,(SOCKADDR*)&srvaddr,sizeof(SOCKADDR));
//。

lt=listen(socketsrv,5);

char sendbuff[100]= "welcome to my home\n ";
sockaddr_in clientaddr;
int len=sizeof(SOCKADDR);

while(1)
{
SOCKET clientsoc=accept(socketsrv,(sockaddr*)&clientaddr,&len);
if(clientsoc==INVALID_SOCKET)
printf( "accept error\n ");

//printf( "please input data: ");
//gets(sendbuff);
send(clientsoc,sendbuff,sizeof(sendbuff)+1,0);

char recvbuff[100];
int r=-1;
r=recv(clientsoc,recvbuff,sizeof(recvbuff)+1,0);
if(r==0)
printf( "connect end ");
else if(r==SOCKET_ERROR)
{
r=WSAGetLastError();
printf( "r=%derror ",r);
}

printf( "%s\n ",recvbuff);
closesocket(clientsoc);
}
//WSACleanup();
//closesocket(socketsrv);
}

[解决办法]
accept一个请求后,另开一个线程来收,发数据.

你的服务端代码在recv后就closesocket(clientsoc);
当然只收发一次.
[解决办法]
accept一个请求后,另开一个线程来收,发数据.
楼上说得没错,用多线程
------解决方案--------------------


创建线程收发数据,或采用异步模式,响应消息到达事件

读书人网 >VC/MFC

热点推荐