请教关于bind的问题。。。
int main(){
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2, 2,), &wsadata)!=0){
printf("InitWSASartup error!");
return -1;
}
SOCKET rawsock = NULL;
SOCKADDR_IN addrsock;
int settimeout = 500;
if((rawsock=socket(AF_INET, SOCK_RAW, IPPROTO_IP))==INVALID_SOCKET)
{
printf("Socket Setup error!\n");
return -1;
}
addrsock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrsock.sin_family = AF_INET;
addrsock.sin_port = htons(10050);
char name[100] ={0};
struct hostent* pHostent;
gethostname(name, 100);
pHostent=gethostbyname(name);
int num=0;
while( pHostent->h_addr_list[num++] != NULL);
num -=1 ;
printf("%s\n",inet_ntoa(*((in_addr*)pHostent->h_addr_list[0])));
addrsock.sin_addr.S_un.S_addr = inet_addr("192.186.168.132");
int ret = bind(rawsock, (SOCKADDR*)&addrsock, sizeof(SOCKADDR));
if(ret==SOCKET_ERROR){
printf("socked bind fail!\n");
printf("%d",GetLastError);
}
setsockopt(rawsock,SOL_SOCKET,SO_RCVTIMEO,(char *)&settimeout,sizeof(int));
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0;
DWORD lpoBuffer = 1;
WSAOVERLAPPED wsaover;
if(WSAIoctl(rawsock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), &lpoBuffer, sizeof(lpoBuffer), &lpcbBytesReturned, NULL, NULL)!=SOCKET_ERROR){
printf("set socket model fail!\n");
printf("%d\n",WSAGetLastError());
return -1;
}
//listen(rawsock, 5);
SOCKADDR_IN addrrecv;
int len = sizeof(addrrecv);
while(1){
char recvbuff[200];
ret = recvfrom(rawsock, recvbuff, 200, 0, (SOCKADDR*)&addrrecv, &len);
IPHEADER* pIpheader;
pIpheader = (IPHEADER*)recvbuff;
if (pIpheader->proto==IPPROTO_TCP)
{
char* sourceip=inet_ntoa(addrrecv.sin_addr);
printf("%s\n", sourceip);
TCPHEADER *lpTCPheader=(TCPHEADER*)(recvbuff+sizeof(IPHEADER));
int Port = ntohs(lpTCPheader->th_sport);
printf("%d\n", Port);
}
}
}
想写个抓包程序,为什么我绑定的是INADDR_ANY,bind就可以成功,但是没有抓到包,而绑定的是本地地址192.168.186.132就一直失败,是什么原因,谢谢了!
没分了,只能来非技术区发帖了!汗 !!!
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2, 2,), &wsadata)!=0){
printf("InitWSASartup error!");
return -1;
}
SOCKET rawsock = NULL;
SOCKADDR_IN addrsock;
int settimeout = 500;
if((rawsock=socket(AF_INET, SOCK_RAW, IPPROTO_IP))==INVALID_SOCKET)
{
printf("Socket Setup error!\n");
return -1;
}
addrsock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrsock.sin_family = AF_INET;
addrsock.sin_port = htons(10050);
char name[100] ={0};
struct hostent* pHostent;
gethostname(name, 100);
pHostent=gethostbyname(name);
int num=0;
while( pHostent->h_addr_list[num++] != NULL);
num -=1 ;
printf("%s\n",inet_ntoa(*((in_addr*)pHostent->h_addr_list[0])));
addrsock.sin_addr.S_un.S_addr = inet_addr("192.186.168.132");
int ret = bind(rawsock, (SOCKADDR*)&addrsock, sizeof(SOCKADDR));
if(ret==SOCKET_ERROR){
printf("socked bind fail!\n");
printf("%d",GetLastError);
}
setsockopt(rawsock,SOL_SOCKET,SO_RCVTIMEO,(char *)&settimeout,sizeof(int));
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0;
DWORD lpoBuffer = 1;
WSAOVERLAPPED wsaover;
if(WSAIoctl(rawsock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), &lpoBuffer, sizeof(lpoBuffer), &lpcbBytesReturned, NULL, NULL)!=SOCKET_ERROR){
printf("set socket model fail!\n");
printf("%d\n",WSAGetLastError());
return -1;
}
//listen(rawsock, 5);
SOCKADDR_IN addrrecv;
int len = sizeof(addrrecv);
while(1){
char recvbuff[200];
ret = recvfrom(rawsock, recvbuff, 200, 0, (SOCKADDR*)&addrrecv, &len);
IPHEADER* pIpheader;
pIpheader = (IPHEADER*)recvbuff;
if (pIpheader->proto==IPPROTO_TCP)
{
char* sourceip=inet_ntoa(addrrecv.sin_addr);
printf("%s\n", sourceip);
TCPHEADER *lpTCPheader=(TCPHEADER*)(recvbuff+sizeof(IPHEADER));
int Port = ntohs(lpTCPheader->th_sport);
printf("%d\n", Port);
}
}
}
想写个抓包程序,为什么我绑定的是INADDR_ANY,bind就可以成功,但是没有抓到包,而绑定的是本地地址192.168.186.132就一直失败,是什么原因,谢谢了!
没分了,只能来非技术区发帖了!汗 !!!
...全文
相关推荐
内测的Gh0st3.0
gh0st3.0内测版本,生成的是shellcode可以直接免杀编译成exe,可以生成的shellcode包括bind、c、delphi、js等。免杀360等不在是问题。关键是看你怎么用。。。至于你要
bind失败的解决方案
四、解决 bind 操作的其他问题在 bind 操作中,还可能会出现其他问题,例如地址使用错误、套接字已经在使用等。这些问题可以通过正确地使用 bind 函数和设置套接字选项来解决。
Bug:Address already in use: JVM_Bind问题之总结
总结:"Address already in use: JVM_Bind"问题主要源于端口资源的冲突,理解TCP/IP协议中关于端口的管理机制以及Java的`ServerSocket`类的工作原理,可以帮助我们有效解决这一问题
网络编程socket之bind函数
在一般情况下,对于服务器进程问题需要调用bind函数,对于客户进程则不需要调用bind函数。
Linux下Socket编程的端口问题 ( Bind(): Address already in use ) PDF版
### Linux下Socket编程的端口问题 (Bind(): Address already in use)#### 一、问题背景与常见场景在进行Linux下的网络编程时,经常会遇到端口绑定失败的问题


非技术区
