WinSocket编程笔记(二)

bind 绑定函数(有三种结构体,这里只介绍一种)

通常,在一个SOCK_STREAM套接字接收连接之前,必须通过bind()函数用本地地址为套接字命名

sockaddr_in 结构体

定义内容:

sin_family 地址族: 与socket()的第一个参数相同含义,必须为 AF_INET
sin_port 端口号
sin_addr IPv4 地址
sin_zero[8] 对齐

实例定义:

sockaddr_in sockAddr;//结构体名称为sockAddr
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(8888);
sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

 注:为了简化编程一般将IP地址设置为INADDR_ANY,如果需要使用特定的IP地址则需要使用inet_addr 和inet_ntoa完成字符串和in_addr结构体的互换

 

listen 监听函数

函数原型:

int listen(int sockfd//已绑定但未监听的套接字, int backlog//挂起连接队列的最大长度)

定义实例:

int listenStatus = listen(mySocket,10);
if(listenStatus == SOCKET_ERROR){
    cout<<"listen error";
    ...
    WSACleanup();
}

 

accept 接收连接请求

函数原型:

SOCKET accept(

       SOCKET s,

       struct sockaddr FAR *addr,

       int FAR *addrlen

);

定义实例:

listen(Socket, 20); 
SOCKET serverocket;
SOCKADDR clntAddr;
int nSize = sizeof(SOCKADDR);
cout << "Wait connection" << endl;
serverocket = accept(Socket//listen的第一个参数名, (SOCKADDR*)&clntAddr, &nSize);

 

connect 请求连接函数

客户端请求与服务器端建立连接

  • socket 若未绑定, 操作系统赋值绑定
  • addr 服务器端的地址结构
  • addrlen 服务器端地址长度
  • 返回值
    • 成功: 返回 0
    • 失败: 返回 SOCKET_ERROR

定义实例:

sockaddr_in server;
        server.sin_family = AF_INET;
        server.sin_port = htons(8828);
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        if (connect(cnetsocket,(sockaddr*)&server,sizeof(server)) == SOCKET_ERROR)
        {
            break;
        }

 

send 发送数据函数

函数原型:

int send(SOCKET S, const char *buf , int len, int flags)
  • 已连接的 socket
  • buf 待发送缓冲区
  • len 待发送内容长度
  • flags 选项, 一般为0

定义实例:

char buf[1024] = {"abcdefghijklmnopqrstuvwxyz"};

int sent = 0;//已发送

int total_size = sizeof(buff);

sent = send(sock, buff+sent, total_size - sent, 0);

 

recv 接收数据函数

在已建立连接的 socket 上接收数据

函数原型:

int recv( SOCKET s,char* buf,int len,int flags);   
  • 已连接的 socket
  • buf 接受缓冲区
  • len 缓冲区长度
  • flags 选项, 一般为 0
      返回值
      • 成功: 返回实际接收的字节数
      • 连接已终止: 0
      • 失败: 返回 SOCKET_ERROR

 

定义实例:

char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);//这一步是初始化 n
= recv(clntSocket, buffer, BUFFER_SIZE, 0)

(待续)

 


 

Reference

https://www.cnblogs.com/quehualin/p/9334030.html

https://blog.csdn.net/guothin/article/details/80635400

WinSocket编程笔记(二)

上一篇:【Visual C#】基于《斗鱼弹幕服务器第三方接入协议v1.6.2》实现斗鱼弹幕服务器接入


下一篇:MS SQLServer 批量附加数据库