关于用socket发送和接收的问题 我用socket的函数sendto和recvfrom函数发送和接收数据,现在的问题是发送出去的icmp包是要求远程主机(肯定能ping通)返回应答包的,但是却没有返回应答包,我用select函数判断socket状态,一直是不可读的,请问这可能是什么原因? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是这样初始化的: WSADATA wsaData; if(WSAStartup(MAKEWORD(2,1),&wsaData) != 0) { fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()); exit(1); }具体代码看看这个:http://community.csdn.net/Expert/topic/5771/5771091.xml?temp=.1828272 还有这样:sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,0); 不会吧,那我给你拷过来,麻烦大侠看下:代码如下: int iSendLen=sizeof(IcmpHeader)+PACKET_SIZE; char * pSendBuf=new char[iSendLen]; struct sockaddr_in socDest; strIP="192.168.10.122"; socket sockRaw; WSADATA wsaData; if(WSAStartup(MAKEWORD(2,1),&wsaData) != 0) { fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()); exit(1); } sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,0); if(INVALID_SOCKET==sockRaw) { printf("invalid socket!\n"); exit(1); } FillIcmpPackets((IcmpHeader*)pSendBuf,iSendLen); socDest.sin_addr.s_addr=inet_addr(strIP); socDest.sin_family=AF_INET; int iSendNum; if(SOCKET_ERROR==(iSendNum = sendto(sockRaw,pSendBuf,iSendLen,0, \ (sockaddr *)&socDest,sizeof(socDest)))) { printf("sendto failed!\n"); closesocket(sockRaw); exit(1); } printf("have sent to %s %d packets!\n",(char *)strIP,iSendNum); fd_set fds; FD_ZERO(&fds); FD_SET(sockRaw,&fds); timeval iTimeval={1,0}; int iResult=select(NULL,&fds,0,0,&iTimeval);上面这段代码就是用sendto发送一个包,然后用select判断socket是否是可读的,进一步再接收。上面192.168.10.122肯定是可以ping通的但是select老是返回0,这是什么原因? MFC中如何更改属性页上切换按钮的背景 MFC怎么写入HOST Excel写入慢的问题 如何得到一个菜单的区域? 关于template特化的问题!!!!!!! 这个程序中的函数该用什么来替换? 关于文件的删除??? 关于属性页的Apply按钮 100分问:服务器用tcp流发包由于太快,客户端是否因为来不及收包而丢包?如果是如何解决?是否在发包时延时. 删除兼容dc之前有必要恢复兼容dc的数据吗 我自己写的类,可以给别人用,但不能给别人看见源码,怎么办? 帮忙看下socket的一段代码
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
{
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
exit(1);
}
具体代码看看这个:
http://community.csdn.net/Expert/topic/5771/5771091.xml?temp=.1828272
代码如下:
int iSendLen=sizeof(IcmpHeader)+PACKET_SIZE;
char * pSendBuf=new char[iSendLen];
struct sockaddr_in socDest;
strIP="192.168.10.122"; socket sockRaw;
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
{
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
exit(1);
} sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,0);
if(INVALID_SOCKET==sockRaw)
{
printf("invalid socket!\n");
exit(1);
} FillIcmpPackets((IcmpHeader*)pSendBuf,iSendLen); socDest.sin_addr.s_addr=inet_addr(strIP);
socDest.sin_family=AF_INET; int iSendNum;
if(SOCKET_ERROR==(iSendNum = sendto(sockRaw,pSendBuf,iSendLen,0, \
(sockaddr *)&socDest,sizeof(socDest))))
{
printf("sendto failed!\n");
closesocket(sockRaw);
exit(1);
}
printf("have sent to %s %d packets!\n",(char *)strIP,iSendNum);
fd_set fds;
FD_ZERO(&fds);
FD_SET(sockRaw,&fds);
timeval iTimeval={1,0};
int iResult=select(NULL,&fds,0,0,&iTimeval);上面这段代码就是用sendto发送一个包,然后用select判断socket是否是可读的,进一步再接收。上面192.168.10.122肯定是可以ping通的但是select老是返回0,这是什么原因?