深入探讨C语言中的WS2TCPIP头文件

版权申诉
5星 · 超过95%的资源 2 下载量 188 浏览量 更新于2024-11-03 收藏 1KB RAR 举报
资源摘要信息:"C语言头文件 WS2TCPIP.H 是一个重要的网络编程相关文件,通常用于 Windows 平台上提供 TCP/IP 网络功能的编程接口。 WS2TCPIP.H 中定义了 Windows Sockets 规范的第二版(Winsock2)的相关宏、类型定义和函数原型。Winsock2 是 Windows 操作系统中用于网络通信的编程接口,它基于 BSD Sockets API,因此熟悉 BSD Sockets 的开发者可以很快上手使用 Winsock2 API。 Winsock2 头文件 WS2TCPIP.H 提供了对 IPv4 和 IPv6 网络协议的支持,并支持 TCP(传输控制协议)、UDP(用户数据报协议)和 IP(互联网协议)等多种网络协议。通过这些定义,程序员可以利用 Winsock2 接口进行网络通信程序的编写,实现客户端与服务器之间或者同一网络中计算机之间的数据传输。 使用 WS2TCPIP.H 中的接口,开发者可以创建套接字(sockets),绑定本地地址和端口,连接到远程服务器,发送和接收数据,以及对套接字进行配置和管理。这些功能对于开发网络应用程序,例如 HTTP 客户端、FTP 客户端或服务器、电子邮件客户端、实时通信应用等都是必不可少的。 在 Windows 平台上,为了使用 Winsock2,开发者必须在程序的源代码中包含 WS2TCPIP.H 头文件,并链接到 Windows Sockets 库文件。通常在编写网络通信程序时,需要进行以下步骤: 1. 初始化 Winsock2 库。 2. 创建套接字。 3. 绑定套接字到指定的网络地址和端口。 4. 连接到远程服务器或者监听端口等待连接。 5. 通过套接字发送和接收数据。 6. 关闭套接字。 7. 清理并卸载 Winsock2 库。 在编程中,还可能会用到 WS2TCPIP.H 提供的其他网络相关的数据类型和函数,比如用于错误检查的 WSAStartup() 和 WSACleanup() 函数,以及用于异步数据传输的 overlapped I/O 函数等。 对于需要跨平台的网络编程,需要注意到 BSD Sockets API 和 Winsock2 API 在某些方面有所不同。例如,Winsock2 中的文件句柄和套接字句柄是不同的,而在类 Unix 系统中,文件描述符是可以用于网络通信的。因此,在编写跨平台网络应用时,需要根据目标平台进行适当的调整和抽象。 WS2TCPIP.H 头文件是 Windows 程序员在网络编程领域的重要资源,它提供了一套丰富且强大的API,使得开发者能够构建稳定和高效的网络应用程序。"
2014-06-25 上传
关于嗅探器的源代码#include #include #include #include #include #pragma comment(lib,"ws2_32.lib") #define MAX_HOSTNAME_LAN 255 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define MAX_ADDR_LEN 16 struct ipheader { unsigned char ip_hl:4; unsigned char ip_v:4; unsigned char ip_tos; unsigned short int ip_len; unsigned short int ip_id; unsigned short int ip_off; unsigned char ip_ttl; unsigned char ip_p; unsigned short int ip_sum; unsigned int ip_src; unsigned int ip_dst; }; typedef struct tcpheader { unsigned short int sport; unsigned short int dport; unsigned int th_seq; unsigned int th_ack; unsigned char th_x:4; unsigned char th_off:4; unsigned char Flags; unsigned short int th_win; unsigned short int th_sum; unsigned short int th_urp; }TCP_HDR; typedef struct udphdr { unsigned short sport; unsigned short dport; unsigned short len; unsigned short cksum; }UDP_HDR; void main(){ SOCKET sock; WSADATA wsd; DWORD dwBytesRet; unsigned int optval = 1; unsigned char *dataudp,*datatcp; int i,pCount=0,lentcp, lenudp; SOCKADDR_IN sa,saSource, saDest; struct hostent FAR * pHostent; char FAR name[MAX_HOSTNAME_LAN]; char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN],RecvBuf[65535] = {0}; struct udphdr *pUdpheader; struct ipheader *pIpheader; struct tcpheader *pTcpheader; WSAStartup(MAKEWORD(2,1),&wsd); if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP))==SOCKET_ERROR) exit(1); gethostname(name, MAX_HOSTNAME_LAN); pHostent = gethostbyname(name); sa.sin_family = AF_INET; sa.sin_port = htons(6000); memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length); bind(sock, (SOCKADDR *)&sa, sizeof(sa)); if ((WSAGetLastError())==10013) exit(1); WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL); pIpheader = (struct ipheader *)RecvBuf; pTcpheader = (struct tcpheader *)(RecvBuf+ sizeof(struct ipheader )); pUdpheader = (struct udphdr *) (RecvBuf+ sizeof(struct ipheader )); while (1){ memset(RecvBuf, 0, sizeof(RecvBuf)); recv(sock, RecvBuf, sizeof(RecvBuf), 0); saSource.sin_addr.s_addr = pIpheader->ip_src; strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN); saDest.sin_addr.s_addr = pIpheader->ip_dst; strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN); lentcp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader))); lenudp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr))); if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!=0){ printf("*******************************************\n"); pCount++; datatcp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct tcpheader); printf("-TCP-\n"); printf("\n%s\n",szDestIP); printf("\n%i\n",ntohs(pTcpheader->dport)); printf("datatcp address->%x\n",datatcp); printf("size of ipheader->%i\n",sizeof(struct ipheader)); printf("size of tcpheader->%i\n",sizeof(struct tcpheader)); printf("size of the hole packet->%i\n",ntohs(pIpheader->ip_len)); printf("\nchar Packet%i [%i]=\"",pCount,lentcp-1); for (i=0;i<lentcp;i++){ printf("\\x%.2x",*(datatcp+i)); if (i==0) printf("\"\n\""); } printf("\";\n\n\n"); for (i=0;i<lentcp;i++){ if( *(datatcp+i)=20) printf("%c",*(datatcp+i)); else printf("."); } printf("\n\n*******************************************\n"); } if((pIpheader->ip_p)==IPPROTO_UDP&&lentcp!=0){ pCount++; dataudp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct udphdr); printf("-UDP-\n"); printf("\n%s\n",szDestIP); printf("\n%d\n",ntohs(pTcpheader->dport)); printf("UDP%x\n",dataudp); printf("IP%i\n",sizeof(struct ipheader)); printf("UDP%i\n",sizeof(struct udphdr)); printf("%i\n",ntohs(pIpheader->ip_len)); printf("\nchar Packet%i [%i]=\"",pCount,lenudp-1); for (i=0;i<lenudp;i++){ printf("\\x%.2x",*(dataudp+i)); if (i==0) printf("\"\n\""); } printf("\";\n\n\n"); for (i=0;i<lenudp;i++){ if( *(dataudp+i)=20) printf("%c",*(dataudp+i)); else printf("."); } printf("\n\n*******************************************\n"); } } }