赞
踩
WSAStartup() -> socket() -> htons() / htonl() -> bind() -> listen() -> accept() -> recv() / send() -> closesocket() -> WSACleanup()
如果是客户端程序,其调用序列为:
WSAStartup() -> socket() -> htons() / htonl() -> connect() -> recv() / send() -> closesocket() -> WSACleanup()
WINSOCK API主要函数简介
作者利用WINSOCK API 编写了一个具有聊天室功能的应用程序,可用作学习 WINSOCK 程序设计的参照。WINSOCK API 包括很多函数,但其中最常用,包括在文章所附源程序中的有:
注:只是有关函数的简要说明,具体规则、说明请参见VC++帮助和WINSOCK规范。
1、WSAStartup():连结应用程序与 Windows Sockets DLL 的第一个函数。
说明: 此函数是应用程序调用 Windows Sockets DLL函数中的第一个,也唯有此函数呼叫成功後,才可以再调用其他 Windows Sockets DLL 的函数。
2、WSACleanup():结束 Windows Sockets DLL 的使用。
说明: 当应用程序不再需要使用 Windows Sockets DLL时,须调用此函数来注销使用,以便释放其占用的资源。
3、 socket():建立Socket。
说明: 此函数用来建立一 Socket 描述字,并为此 Socket 建立其所使用的资源。
4、 closesocket():关闭某一Socket。
说明: 此一函数是用来关闭某一 Socket。
5、 bind():将一本地地址与一个SOCKET描述字连接在一起。
说明:此函数在服务程序上使用,是调用监听函数listen()必须要调用的函数。
6、 listen():设定 Socket 为监听状态,准备被连接。
说明: 此函数在服务程序上使用,来设定 Socket 进入监听状态,并设定最多可有多少个在未真正完成连接前的客户端的连接要求。(目前最大值限制为 5, 最
小值为1)
7、 accept():接受某一Socket的连接要求,以完成面向连接的客户端 Socket 的连接请求。
说明: 服务端应用程序调用此函数来接受客户端Socket 连接请求,accept() 函数的返回值为一新的 Socket,新 Socket 就可用来在服务端和客户端之间的信息传递接收,而原来 Socket 仍然可以接收其他客户端的连接要求。
8、 connect():要求连接某一Socket到指定的网络上服务端。
说明: 此函数用在客户端,用来向服务端要求建立连接。当连接建立完成後,客户端即可利用此 Socket 来与服务端进行信息传递。
9、 recv():从面向连接的 Socket 接收信息。
说明: 此函数用来从面向连接的 Socket 接收信息。
10、send():使用面向连接的 Socket 发送信息。
说明: 此函数用来从面向连接的 Socket 发送信息。
11、WSAAsyncSelect():要求某一 Socket 有事件 (event) 发生时通知使用者。
说明: 此函数用来请求Windows Sockets DLL 为窗口句柄发一条消息-无论它何时检测到由lEvent参数指明的网络事件。要发送的消息由wMsg参数标明.被通知的套接口由s标识。本函数自动将套接口设置为非阻塞模式。
lEvent参数由下表中列出的值组成。
值 意义
FD_READ 欲接收读准备好的通知。
FD_WRITE 欲接收写准备好的通知。
FD_OOB 欲接收带边数据到达的通知。
FD_ACCEPT 欲接收将要连接的通知。
FD_CONNECT 欲接收已连接好的通知。
FD_CLOSE 欲接收套接口关闭的通知。
这个函数可以认为是 WINSOCK API 中最为重要的一个函数。要想使用好这个函数,你必须对 WINDOWS 编程的事件驱动和消息传递有很清楚的了解。
服务器端源代码如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return;
if(LOBYTE(wsaData.wVersion != 1) || HIBYTE(wsaData.wVersion != 1))
{
WSACleanup( );
return;
}
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6009);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
char sendBuf[500];
char recvBuf[500];
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
printf("welcome!");
sprintf(sendBuf,"Welcome %s to XXX",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
recv(sockConn,recvBuf,100,0);
closesocket(sockConn);
}
}
客户端代码如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup( wVersionRequested, &wsaData );
if( err != 0)
{
return ;
}
if( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return ;
}
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6009);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s/n",recvBuf);
send(sockClient,"This is the client",strlen("This is client.")+1,0);
closesocket(sockClient);
WSACleanup();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。