当前位置:   article > 正文

WINSOCK API的Socket编程_winsock编写socket

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/147073
推荐阅读
相关标签
  

闽ICP备14008679号