MAKEWORD(2,2)使用

大凡在WIN32平台上的WINSOCK编程都要经过下列步骤:
      定义变量->获得WINDOCK版本->加载WINSOCK库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载WINSOCK库->释放资源

     下面介绍WINSOCK C/S的建立过程:

     服务器                         客户端
________________________________________________
  初始化WSA                      1   初始化WSA
____________________________________________________
  建立一个SOCKET                 2   建立一个SOCKET
_____________________________________________________
  绑定SOCKET                     3   连接到服务器
_____________________________________________________
  在指定的端口监听               4   发送和接受数据
_____________________________________________________
  接受一个连接                   5    断开连接
______________________________________________________-
  发送和接受数据
___________________________________________________
  断开连接
__________________________________________________
  
    大家注意,在VC中进行WINSOCK编程时,需要引入如下两个库文件:WINSOCK.H(这个是WINSOCK API的头文件,WIN2K以上支持WINSOCK2,所以
可以用WINSOCK2.H);Ws2_32.lib(WINSOCK API连接库文件).
使用方式如下:
               #include <winsock.h>
           #pragma comment(lib,"ws2_32.lib")
  
   下面我们通过具体的代码演示服务器和客户端的工作流程:

首先,建立一个WSADATA结构,通常用wsaData
WSADATA wsaData;

然后,调用WSAStartup函数,这个函数是连接应用程序与winsock.dll的第一个调用.其中,第一个参数是WINSOCK 版本号,第二个参数是指向
WSADATA的指针.该函数返回一个INT型值,通过检查这个值来确定初始化是否成功.调用格式如下:WSAStartup(MAKEWORD(2,2),&wsaData),其中
MAKEWORD(2,2)表示使用WINSOCK2版本.wsaData用来存储系统传回的关于WINSOCK的资料.

if(iResuit=WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
     printf("WSAStartup failed:%d",GetLastError());   //返回值不等与0,说明初始化失败

     if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
         printf( "bind() failed.\n" );
         closesocket(server);
         return;
     }
    
                                                                               // 监听 socket
     if ( listen( server, 1 ) == SOCKET_ERROR )
         printf( "Error listening on socket.\n");

                                                                                 // 接受连接
     SOCKET AcceptSocket;

     printf( "Waiting for a client to connect...\n" );
     while (1) {
         AcceptSocket = SOCKET_ERROR;
         while ( AcceptSocket == SOCKET_ERROR ) {
             AcceptSocket = accept( server, NULL, NULL );
         }
         printf( "Client Connected.\n");
         server = AcceptSocket;
         break;
     }
    
                                                                                      // 发送接受数据
     int bytesSent;
     int bytesRecv = SOCKET_ERROR;
     char sendbuf[32] = "Server: Sending Data.";
     char recvbuf[32] = "";
    
     bytesRecv = recv( server, recvbuf, 32, 0 );
     printf( "Bytes Recv: %ld\n", bytesRecv );
    
     bytesSent = send( server, sendbuf, strlen(sendbuf), 0 );
     printf( "Bytes Sent: %ld\n", bytesSent );

     return;

C++ 中的 Winsock2 是Windows下的套接字API,用于网络编程,它是以前Winsock API的升级版本。以下是使用Winsock2的基本步骤: 1. **初始化库**: 首先需要包含winsock2.h头文件,并在程序启动时调用`WSAStartup`函数来初始化Winsock。确保之前已经导入了Windows Socket库(ws2_32.lib),例如: ```cpp #include <winsock2.h> WSADATA wsaData; int err = WSAStartup(MAKEWORD(2, 2), &wsaData); if (err != 0) { // 初始化失败处理 } ``` 2. **创建套接字**: 使用`socket`函数创建一个新的套接字,指定协议族、类型和协议。比如TCP通信可以这样创建: ```cpp SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ``` 3. **设置套接字选项**: 可能会用到`setsockopt`来设置套接字属性。 4. **绑定地址**: 对于服务器,使用`bind`函数将套接字与特定的IP地址和端口关联起来: ```cpp sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(portNumber); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)); ``` 5. **监听连接**: 对于服务器,使用`listen`来开始监听新的连接请求。 6. **接受连接**: 对于服务器,调用`accept`等待客户端连接,返回一个新的套接字代表客户端连接。 7. **发送和接收数据**: 使用`send`和`recv`函数来进行双向的数据传输。 8. **关闭套接字**: 当完成所有操作后,记得关闭套接字和Winsock库: ```cpp closesocket(sock); WSACleanup(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值