Windows Sockets2 详解1——服务器客户端通讯

服务器客户端通讯,简单的说就是建立连接,然后发送和接收数据。

服务器端 :

1、初始化winsock

2、创建socket对象

3、在socket对象上执行bind操作,将创建的socket对象与主机地址绑定

4、在socket对象上执行Listen操作,侦听客户端的连接请求

5、在socket对象上执行Accept操作,接受客户端的连接请求,如果socket处于堵塞模式,服务器在调用Accept后,该服务器端线程被挂起,直到有客户连接到达后线程才继续执行。

6、连接已建立,可以利用Accept得到的socke发送和接收数据了。通常是对socket执行send和recv操作

7、执行完毕后断开连接

 

客户端:

 

1、初始化winsock

2、创建socket对象

3、对socket执行connect操作,连接到服务器

4、发送和接收数据,同服务器端。

5、关闭连接

 

 以下代码简单的示范了这个过程,其中省略了错误处理

服务器端

 

ExpandedBlockStart.gif 代码
#include  " stdafx.h "
#define   BUF_SZIE     64
#include 
" winsock2.h "
#pragma  comment(lib, "ws2_32.lib")

int  main( int  argc,  char *  argv[])
{
    WSADATA            wsd;            
// WSADATA变量
    SOCKET            sServer;         // 服务器套接字
    SOCKET            sClient;         // Accept得到的客户端套接字
    SOCKADDR_IN        addrServ;;         // 服务器地址
     char             buf[BUF_SZIE];     // 接收数据缓冲区
     int                 retVal;             // 返回值

    
// 初始化套结字动态库
    WSAStartup(MAKEWORD( 2 , 2 ),  & wsd);
    
    
// 创建套接字
    sServer  =  socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
    
    
// 服务器套接字地址 
    addrServ.sin_family  =  AF_INET;
    addrServ.sin_port 
=  htons( 4999 );
    addrServ.sin_addr.s_addr 
=  INADDR_ANY;        
    
// 绑定套接字
    retVal  =  bind(sServer, (LPSOCKADDR) & addrServ,  sizeof (SOCKADDR_IN));
    
    
// 开始监听 
    retVal  =  listen(sServer,  1 );
    
    
// 接受客户端请求
    sockaddr_in addrClient;
    
int  addrClientlen  =   sizeof (addrClient);
    sClient 
=  accept(sServer,(sockaddr FAR * ) & addrClient,  & addrClientlen);  // 线程在此处挂起,直到有连接到达
    
    
// 接收客户端数据
    ZeroMemory(buf, BUF_SZIE);
    retVal 
=  recv(sClient, buf, BUF_SZIE,  0 );

    printf(
" %s\n " , buf);    

    
// 退出
    closesocket(sServer);     // 关闭套接字
    closesocket(sClient);     // 关闭套接字
    WSACleanup();         // 释放套接字资源;
     return   0 ;
}


客户端:

ExpandedBlockStart.gif 代码
#include  " stdafx.h "
#define     BUF_SZIE    64
#include 
" winsock2.h "
#pragma  comment(lib, "ws2_32.lib")

int  main( int  argc,  char *  argv[])
{

    WSADATA            wsd;            
// WSADATA变量
    SOCKET            sHost;             // 服务器套接字
    SOCKADDR_IN        servAddr;         // 服务器地址
     char             buf[BUF_SZIE];     // 接收数据缓冲区
     int                 retVal;             // 返回值
    
    
// 初始化套结字动态库
    WSAStartup(MAKEWORD( 2 , 2 ),  & wsd);
    
    
    
// 创建套接字
    sHost  =  socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    

    
// 设置服务器地址
    servAddr.sin_family  = AF_INET;
    servAddr.sin_addr.s_addr 
=  inet_addr( " 127.0.0.1 " );
    servAddr.sin_port 
=  htons(( short ) 4999 );
    
int     nServAddlen   =   sizeof (servAddr);

    
// 连接服务器
    retVal = connect(sHost,(LPSOCKADDR) & servAddr,  sizeof (servAddr));    
    
    
// 向服务器发送数据
    ZeroMemory(buf, BUF_SZIE);
    strcpy(buf, 
" MyTCP " );
    retVal 
=  send(sHost, buf, strlen(buf),  0 );
    
    
// 退出
    closesocket(sHost);     // 关闭套接字
    WSACleanup();         // 释放套接字资源
     return   0 ;
}


 

 

 

 

 

转载于:https://www.cnblogs.com/hjblog/archive/2010/11/15/1877927.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值