基于Windows的套接字相关函数及示例
链接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的套接字相关函数及示例的更多相关文章
- windows套接字相关函数
windows套接字相关函数 作者:vpoet mail:vpoet_sir@163.com 我们学习TCP/IP协议无非是利用这些协议进行通信开发,然而如果让我们自己来直接根据协议规则和协议格式来进 ...
- 基于UDP的套接字、粘包问题
一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...
- Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信
一:基于多线程实现套接字 可添加多个客户端 from socket import * from threading import Thread def comunicate(conn): while ...
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- Python网络编程之TCP套接字简单用法示例
Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...
- Day9 基于TCP的套接字和基于UDP的套接字
服务端: ss=socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听套接字, inf_loop: #服务器无限循环 cs=ss.accept( ...
- 03、Windows Phone 套接字(Socket)实战之WP客户端设计
因为 PC 端和 WP 端进行通信时,采用的自定义的协议,所以也需要定义 DataType 类来判断 通信数据的类型,并且把数据的描述信息(head) 和数据的实际内容(body)进行拼接和反转,所以 ...
- 基于udp的套接字编程
一,简单明了了解udp套接字编程 客户端: #Author : Kelvin #Date : 2019/1/30 11:07 from socket import * ip_conf=("1 ...
- 基于udp的套接字
1 ss = socket() #创建一个服务器的套接字 2 ss.bind() #绑定服务器套接字 3 inf_loop: #服务器无限循环 4 cs = ss.recvfrom()/ss.send ...
随机推荐
- apache开源项目--Apache Commons Imaging
Apache Commons Imaging 前身是 Apache Commons Sanselan ,这是一个用来读写各种图像格式的 Java 类库,包括快速解析图片的基本信息(大小.色彩空间.IC ...
- Log4net 写文件日志与数据库日志
一.数据库日志表结构 CREATE TABLE [dbo].[WebLog_Msg]( [LogID] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime] ...
- [Irving]SQL去重复-DISTINCT用法
在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 示例1 select distinct nam ...
- Test Controller Tool
- 简单实例一步一步帮你搞清楚MVC3中的路由以及区域
我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...
- 字符串逆转(递归和非递归java)
package 乒乒乓乓; public class 递归逆转字符串 { //非递归逆转 public static String reverse(String s) { ...
- Java笔记(十八)……包
概述 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称的是 包名.类名. 包也是一种封装形式. 访问权限 引用<The Complete Reference&g ...
- HDU 1166 敌兵布阵 线段树区间求和 更改
水 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> ...
- 利用gdb 调试android jni c动态库
http://blog.dornea.nu/2015/07/01/debugging-android-native-shared-libraries/ Since I haven't done thi ...
- epoll原理解释(转)
转自:http://yaocoder.blog.51cto.com/2668309/888374 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. ...