下面是服务器端的一段代码,服务器端启动,紧接着启动两个客户端,结果发现:两个客户端都能成功连接服务器端,但是发送数后,只有第二个启动的客户端数据可以到达服务器端,而第一个启动的客户端发送的数据无法到达服务器端。这是为什么? ...
WSAStartup(MAKEWORD(2,0),&wsaData);
sockfd=socket(AF_INET,SOCK_STREAM,0);
my_server.sin_family=AF_INET;
my_server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//htonl(INADDR_ANY);
my_server.sin_port=htons(5000);//htons(5000);
if (bind(sockfd, (struct sockaddr *)&my_server, sizeof(struct sockaddr)) <0) {
ShowError();
}
if (listen(sockfd,2) == -1) {
ShowError();
//perror("listen Error!");
//exit(1);
}
WSAAsyncSelect(sockfd,hWnd,SOCKETMSG,FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);
...
case SOCKETMSG:
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
char buf[256];
ZeroMemory(buf,256);
recv(connected_skt,buf,sizeof(buf),0);
SetDlgItemText(hWnd,IDC_REVTXT,buf); //显示接受到的消息
}
break;
case FD_WRITE:
break;
case FD_CLOSE:
closesocket(connected_skt);
break;
case FD_CONNECT:
SetDlgItemText(hWnd,IDC_REVTXT,"已经连接上");//显示接受到的消息
MessageBox(NULL,"FD_CONNECT","",MB_OK);
break;
case FD_ACCEPT:
{
int Len = sizeof(clientaddr);
//建立连接,得到的地址存入客户端clientaddr地址中去
// socketNumber=socketNumber+1;
if((connected_skt=accept(skt,(struct sockaddr *)&clientaddr,&Len))== INVALID_SOCKET )
{
MessageBox(hWnd,"接受客户端的Socket连接失败", szDlgTitle,MB_OK);
return FALSE;
}else
{
//MessageBox(hWnd,"接受客户端的Socket连接成功", szDlgTitle,MB_OK);
}
//连接上了,然后监听客户端的FD_READ和关闭
WSAAsyncSelect(connected_skt, hWnd,SOCKETMSG,FD_READ|FD_CLOSE);
char *welcome="欢迎您!!";
MessageBox(hWnd,welcome, szDlgTitle,MB_OK);
}
break;
}
break;
WSAStartup(MAKEWORD(2,0),&wsaData);
sockfd=socket(AF_INET,SOCK_STREAM,0);
my_server.sin_family=AF_INET;
my_server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//htonl(INADDR_ANY);
my_server.sin_port=htons(5000);//htons(5000);
if (bind(sockfd, (struct sockaddr *)&my_server, sizeof(struct sockaddr)) <0) {
ShowError();
}
if (listen(sockfd,2) == -1) {
ShowError();
//perror("listen Error!");
//exit(1);
}
WSAAsyncSelect(sockfd,hWnd,SOCKETMSG,FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);
...
case SOCKETMSG:
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
char buf[256];
ZeroMemory(buf,256);
recv(connected_skt,buf,sizeof(buf),0);
SetDlgItemText(hWnd,IDC_REVTXT,buf); //显示接受到的消息
}
break;
case FD_WRITE:
break;
case FD_CLOSE:
closesocket(connected_skt);
break;
case FD_CONNECT:
SetDlgItemText(hWnd,IDC_REVTXT,"已经连接上");//显示接受到的消息
MessageBox(NULL,"FD_CONNECT","",MB_OK);
break;
case FD_ACCEPT:
{
int Len = sizeof(clientaddr);
//建立连接,得到的地址存入客户端clientaddr地址中去
// socketNumber=socketNumber+1;
if((connected_skt=accept(skt,(struct sockaddr *)&clientaddr,&Len))== INVALID_SOCKET )
{
MessageBox(hWnd,"接受客户端的Socket连接失败", szDlgTitle,MB_OK);
return FALSE;
}else
{
//MessageBox(hWnd,"接受客户端的Socket连接成功", szDlgTitle,MB_OK);
}
//连接上了,然后监听客户端的FD_READ和关闭
WSAAsyncSelect(connected_skt, hWnd,SOCKETMSG,FD_READ|FD_CLOSE);
char *welcome="欢迎您!!";
MessageBox(hWnd,welcome, szDlgTitle,MB_OK);
}
break;
}
break;
解决方案 »
- 在MFC基于对话框编程中,一旦定义一个CPtrArray成员变量后在执行int nResponse = dlg.DoModal()时就出错了
- 求DDraw创建一个对话框的方案?
- 关于 使用C++ 如何实现 OLE包容 最小接口的问题?
- 已有数据存于x[],y[],z[]三个数组,如何用vc编程在屏幕上绘出三维图形?
- 新建一个单文档程序,关闭的时候不想让系统提示是否保存,想直接关闭,咋办?
- 小问题,一样给分
- 我想让DoModal()产生的对话框,按下Enter和Esc时,不退出,该怎么办??
- PASV模式是干什么的?
- 菜鸟问题:如何给OnLButtonDown发送一个消息(PostMessage)
- 在windows中如何截取一个应用程序的消息队列!
- 菜鸟提问:关于头文件和源文件关系的问题!
- 如何取得一个文件打开方式列表
这样只有最后一个连接的socket号被保存下来,之前建立的socket号被丢了,所以只有最后一个可以接收到数据。
while (Runing)
{
status = listen(serverSocket, 5);
if (status == SOCKET_ERROR)
{
AfxMessageBox("ERROR: listen unsuccsessful!" + GetLastError(), MB_OK);
return;
} clientSocket = accept(s, (LPSOCKADDR)&clientSockAddr, &addrLen);
AfxBeginThread(RecvDataProc, (LPVOID)clientSocket);
}
那WSAAsyncSelect应该放到哪里?
{
case FD_READ:
{
char buf[256];
ZeroMemory(buf,256);
recv((SOCKET)wParam,buf,sizeof(buf),0);
SetDlgItemText(hWnd,IDC_REVTXT,buf); //显示接受到的消息
}
break;
case FD_WRITE:
break;
case FD_CLOSE:
closesocket((SOCKET)wParam);
break;
case FD_CONNECT:
SetDlgItemText(hWnd,IDC_REVTXT,"已经连接上");//显示接受到的消息
MessageBox(NULL,"FD_CONNECT","",MB_OK);
break;
case FD_ACCEPT:
{
int Len = sizeof(clientaddr);
//建立连接,得到的地址存入客户端clientaddr地址中去
// socketNumber=socketNumber+1;
if((connected_skt=accept(skt,(struct sockaddr *)&clientaddr,&Len))== INVALID_SOCKET )
{
MessageBox(hWnd,"接受客户端的Socket连接失败", szDlgTitle,MB_OK);
return FALSE;
}else
{
//MessageBox(hWnd,"接受客户端的Socket连接成功", szDlgTitle,MB_OK);
}
//连接上了,然后监听客户端的FD_READ和关闭
WSAAsyncSelect(connected_skt, hWnd,SOCKETMSG,FD_READ|FD_CLOSE);
char *welcome="欢迎您!!";
MessageBox(hWnd,welcome, szDlgTitle,MB_OK);
}
break;
}
break;