服务端为什么会这样呢 ?
运行以下程序后服务断自动结束了,我想recvfrom()应该是等待客户锻发来消息再进行响应了,而我的客户端程序没运行,也就是没收到消息服务端就自动结束了,
代码如下:(基于UDP的通信)
#include <stdio.h>
#include <winsock2.h>
void main()
{
WORD ver;
WSADATA wsadata;
int flag;
ver = MAKEWORD(1,1);
flag=WSAStartup(ver,&wsadata);
if(flag !=0)
return ;
if(LOBYTE(wsadata.wVersion) != 1 || HIBYTE(wsadata.wVersion) !=1)
{
WSACleanup();
return ;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addr.sin_family=AF_INET;
addr.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR *)&addr,sizeof(SOCKADDR));
char srvBuf[100]={0};
SOCKADDR_IN addr2;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,srvBuf,100,0,(SOCKADDR *)&addr2,&len);//程序运行到这里应该会类似监听啊
printf( "收到的是 :%s ",srvBuf);
closesocket(sockSrv);
WSACleanup();
}
[解决办法]
应该没有问题把,你的程序调用recvfrom一直阻塞在那里等待数据来,客户端不发数据给过去,他就不会执行后面的printf以下的代码的
[解决办法]
我猜:你可能需要把 socket 设成 blocking , 不然 recvfrom 应该立即就返回了。
[解决办法]
netstat -an 查看当前端口占用情况
你是不是开了QQ在边上,QQ好像占用这6000 port
[解决办法]
这是绑定失败。
可能你换的端口号还是被占用了。
换个7000试试。
[解决办法]
如ls的ls所说,这是绑定失败。我在我这里测试是会等待的。
你改成这样就可以看到结果
int nErr = bind(sockSrv,(SOCKADDR *)&addr,sizeof(SOCKADDR));
if(SOCKET_ERROR == nErr)
{
printf( "bind failed. error code: %d\n ", WSAGetLastError());
return;
}