WINSOCK API的Socket编程

如果是服务器,其WinSDK调用分别为:

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(); 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值