客户端发送的数据为什么服务器端接收不到数据?在服务去端我开了一个线程专门接收数据。我的实现是一个客户端不断接收数据,而其它的客户端(3个)只发送数据(不定时的发送);
程序:服务器端的
sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,6); HANDLE hThread2; //创建线程
hThread2=CreateThread(NULL,0,Fun2Proc,&sockSrv,0,NULL);
CloseHandle(hThread2);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1) //接收数据
{
SOCKET sockCon=accept(sockSrv,(sockaddr*)&addrClient,&len); char SendBuf[100]="WELCOME TO mfc!";
send(sockCon,SendBuf,100,0);
closesocket(sockCon);
}
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter) //线程发送数据
{
SOCKET sockSrv=*((SOCKET*)lpParameter);
SOCKADDR_IN addrClient1;
int len1=sizeof(SOCKADDR);
while(1)
{
SOCKET sockCon=accept(sockSrv,(sockaddr*)&addrClient1,&len1);
char RecvBuf[100];
recv(sockCon,RecvBuf,100,0);
printf("%s\n",RecvBuf);
closesocket(sockCon);
}
return 0;
}
谁帮我看看问题出在哪?
程序:服务器端的
sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,6); HANDLE hThread2; //创建线程
hThread2=CreateThread(NULL,0,Fun2Proc,&sockSrv,0,NULL);
CloseHandle(hThread2);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1) //接收数据
{
SOCKET sockCon=accept(sockSrv,(sockaddr*)&addrClient,&len); char SendBuf[100]="WELCOME TO mfc!";
send(sockCon,SendBuf,100,0);
closesocket(sockCon);
}
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter) //线程发送数据
{
SOCKET sockSrv=*((SOCKET*)lpParameter);
SOCKADDR_IN addrClient1;
int len1=sizeof(SOCKADDR);
while(1)
{
SOCKET sockCon=accept(sockSrv,(sockaddr*)&addrClient1,&len1);
char RecvBuf[100];
recv(sockCon,RecvBuf,100,0);
printf("%s\n",RecvBuf);
closesocket(sockCon);
}
return 0;
}
谁帮我看看问题出在哪?
主线程就只是用来做accpet、并建立接收消息的线程,并不用来接收消息。因为你个while是个无限循环,线程到里循环中,在accept的时候,阻塞,等待客户的连接。发送消息的话,更简单,只要你知道在数组中查找到客户端的socket,不论在那个线程里,都可以发送消息到相应的客户端。我手边没有例子,你最好找一个例子,看看。
socket+多线程+多客户端,去csdn的下载里面,找找
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
clientsocket[i]=sockconn; //这个数组定义成公有的最简单
createthread(); //把clientsocket[i]的地址传进去
i+=1;
}
//在程序运行结束的时候,关闭所有的socket。
在子线程函数中,取到每一个socket,然后,按逻辑进行处理就可以了。
只要客户端没有把端口定死,是可以的,看来你对SOCKET的工作流程不大小解,刚开始学SOCKET吧,可以这么学,先试试无连接的WSAAsyncSelete模型(因为该模型在WINDOWS下最好用,最简单),然后用有连接的该模型,然后selete模型,event模型,多线程,多线程的EVENT模型,重叠IO模型,完成端口,