基于Windows的套接字相关函数及示例

时间:2021-10-02 22:22:42

链接ws2_32.lib库

头文件#include <winsock2.h>

  int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);

初始化Winsock库

wVersionRequested:Winsock版本信息,用MAKEWORD宏构造,MAKEWORD(2,2)。

lpWSAData:WSADATA结构体变量的地址。无特殊含义,但是要传递结构体变量地址。

 int WSACleanup();

注销Winsock相关库,成功返回0,失败返回SOCKET_ERROR。

 SOCKET socket(int af, int type, int protocol);

成功返回套接字句柄,失败返回INVALID_SOCKET。

af:套接字中使用的协议族信息,常用的是PF_INET,IPv4互联网协议族。

type:套接字数据传输类型信息。有面向连接的套接字(SOCK_STREAM),面向消息的套接字(SOCK_DGRAM)。

protocol:计算机间通信中使用的协议信息。选择最终协议,IPv4网络协议族中面向连接的协议(IPPROTO_TCP),面向消息的协议(IPPROTO_UDP)。

 int bind(SOCKET s, struct sockaddr * name, int namelen);

成功返回0,失败返回SOCKET_ERROR。

 int listen(SOCKET s, int backlog);

成功返回0,失败返回SOCKET_ERROR。

 SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);

成功返回套接字句柄,失败返回INVALID_SOCKET。

 int connect(SOCKET s, struct sockaddr * name, int namelen);

成功返回0,失败返回SOCKET_ERROR。

 int closesocket(SOCKET s);

关闭套接字,成功返回0,失败返回SOCKET_ERROR。

 int send(SOCKET s,const char * buf, int len, int flags);

数据传输函数,成功返回传输字节数,失败返回SOCKET_ERROR。

s:数据传输对象连接的套接字句柄值。

buf:保存待传输数据的缓冲地址值。

len:要传输的字节数。

flags:传输数据时要用到的多种选项信息。

 int recv(SOCKET s, const char * buf, int len, int flags);

成功时返回接受的字节数,收到EOF时为0,失败时返回SOCKET_ERROR。

s:数据接收对象连接的套接字句值。

buf:保存接收数据的缓冲地址值。

len:能够接受的最大字节数。

flags:接受数据时用到的多种选项信息。

 #include <WinSock2.h>
#include <iostream> namespace WinSock { void ErrorHandling(char* message) {
std::cerr << message << std::endl;
exit();
} int Server(int port) {
WSADATA wsaData;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;
int szClntAddr;
char message[] = "Hello World!";
if (WSAStartup(MAKEWORD(, ), &wsaData) != ) ErrorHandling("WSAStartup() error");
hServSock = socket(PF_INET, SOCK_STREAM, );
if (hServSock == INVALID_SOCKET) ErrorHandling("socket() error");
memset(&servAddr, , sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(port);
if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("bind() error");
if (listen(hServSock, ) == SOCKET_ERROR) ErrorHandling("listen() error");
szClntAddr = sizeof(clntAddr);
hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
if (hClntSock == INVALID_SOCKET) ErrorHandling("accept() error");
send(hClntSock, message, sizeof(message), );
closesocket(hClntSock);
closesocket(hServSock);
WSACleanup();
return ;
} int Client(char ip[], int port) {
WSADATA wsaData;
SOCKET hSocket;
SOCKADDR_IN servAddr;
char message[];
int strLen;
if (WSAStartup(MAKEWORD(, ), &wsaData) != ) ErrorHandling("WSAStartup() error");
hSocket = socket(PF_INET, SOCK_STREAM, );
if (hSocket == INVALID_SOCKET) ErrorHandling("socket() error");
memset(&servAddr, , sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = inet_addr(ip);
servAddr.sin_port = htons(port);
if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("connect() error");
strLen = recv(hSocket, message, sizeof(message) - , );
if (strLen == -) ErrorHandling("read() error");
std::cout << "Message from server: " << message << std::endl;
closesocket(hSocket);
WSACleanup();
return ;
} };

基于Windows的套接字相关函数及示例的更多相关文章

  1. windows套接字相关函数

    windows套接字相关函数 作者:vpoet mail:vpoet_sir@163.com 我们学习TCP/IP协议无非是利用这些协议进行通信开发,然而如果让我们自己来直接根据协议规则和协议格式来进 ...

  2. 基于UDP的套接字、粘包问题

    一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...

  3. Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信

    一:基于多线程实现套接字 可添加多个客户端 from socket import * from threading import Thread def comunicate(conn): while ...

  4. python笔记8 socket&lpar;TCP&rpar; subprocess模块 粘包现象 struct模块 基于UDP的套接字协议

    socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...

  5. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  6. Day9 基于TCP的套接字和基于UDP的套接字

    服务端: ss=socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听套接字, inf_loop: #服务器无限循环 cs=ss.accept( ...

  7. 03、Windows Phone 套接字(Socket)实战之WP客户端设计

    因为 PC 端和 WP 端进行通信时,采用的自定义的协议,所以也需要定义 DataType 类来判断 通信数据的类型,并且把数据的描述信息(head) 和数据的实际内容(body)进行拼接和反转,所以 ...

  8. 基于udp的套接字编程

    一,简单明了了解udp套接字编程 客户端: #Author : Kelvin #Date : 2019/1/30 11:07 from socket import * ip_conf=("1 ...

  9. 基于udp的套接字

    1 ss = socket() #创建一个服务器的套接字 2 ss.bind() #绑定服务器套接字 3 inf_loop: #服务器无限循环 4 cs = ss.recvfrom()/ss.send ...

随机推荐

  1. 在ubuntu下配置apache运行python脚本

    2008-12-05    常用的简单命令 sudo apt-get remove --purge apache apache2 (彻底删除)   sudo /etc/init.d/apache2 r ...

  2. ajax获取数据库中数据

    xhr=new XMLHttpRequest(); var url="要获取数据的地方"; xhr.open('post',url,true); POST请求头(get就不用写这个 ...

  3. &period;net 禁止远程查看应用程序错误的详细信息,服务器上出现应用程序错误

    打开页面时出现以下错误   "/"应用程序中的服务器错误. 运行时错误 说明: 服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全 ...

  4. linux下vi命令笔记

    vim 编辑器 全屏编辑器 模式化编辑器 vi:Visual Interfacevim:VI iMproved vi增强版vi模式:    编辑模式(命令模式)(默认处于编辑模式)        Ct ...

  5. Java 多线程的一些问题

    1.volatile关键字的作用 一个非常重要的问题,是每个学习.应用多线程的Java程序员都必须掌握的.理解volatile关键字的作用的前提是要理解Java内存模型,volatile关键字的作用主 ...

  6. TF&period;learn学习

    官网地址:https://www.tensorflow.org/versions/r1.1/get_started/tflearn 1.代码例子 实现自定义的Estimator 使用DNNClassi ...

  7. JQuery登录代码

    $(function () { $("#login").submit(function(event) { event.preventDefault(); if ($("# ...

  8. 126&period; Word Ladder II&lpar; Queue&semi; BFS&rpar;

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  9. &lbrack;转&rsqb;eclipse 设置默认编码为Utf-8

    参考:http://www.cnblogs.com/yimu/archive/2011/06/30/SXLYLOVE.html 需要设置的几处地方为: Window->Preferences-& ...

  10. 洛谷 P4719 【模板】动态dp【动态dp】

    是动态dp的板子 大致思想就是用g[u]来表示不包含重链转移的dp值,然后用线段树维护重链,这样线段树的根就相当于这条重链的top的真实dp值 每次修改的时候,修改x点会影响到x到根的真实dp值,但是 ...