使用基本的socket函数
1.socket库的2.2版本的文件:
dll文件:ws2_32.dll
lib文件:ws2_32.lib
头文件:<WINSOCK2.H>
2.socket库的初始化和卸载
2.1-初始化socket库
int WSAStartup (
WORD wVersionRequested, //请求使用的库的版本
LPWSADATA lpWSAData //返回可用的库的信息
);
2.2-卸载socket库
WSACleanup();
2.3-MFC提供了一个AfxSocketInit函数,该函数内部自动调用了WSAStartup函数和WSACleanup函数,利用该函数加载和卸载socket库时,不需要为工程连接ws2_32.lib库文件,仅需包含头文件:#include <Afxsock.h>,且必须在应用的程序类的InitInstance函数中调用该函数,该函数加载的是1.1版本的socket库;
BOOL AfxSocketInit( WSADATA* lpwsaData = NULL );
返回值:函数调用成功返回非0值,调用失败返回0;
3.TCP通信
3.1-TCP服务器
1--创建服务器端socket
SOCKET socket (int af, int type, int protocol);
af:指定地址族,AF_UNIX/AF_LOCAL/AF_FILE--本地通信;AF_INET--网络通信IPv4(主用);AF_INET6--网络通信IPv6(前缀AF替换成PF效果一样);
type:指定socket类型,SOCK_STREAM--流式套接字,SOCK_DGRAM--数据报式套接字;
protocol:推荐为0;
函数返回值:成功返回socket描述符;失败返回一个INVALID_SOCKET值,错误信息可通过WSAGetLastError函数返回;
2--绑定IP地址和端口(bind)
int bind (SOCKET s, const struct sockaddr FAR* name, int namelen);
s:要绑定的套接字;
name:指定该套接字的通信地址信息,指向sockaddr结构体或sockaddr_un结构体或sockaddr_in结构体的指针变量;
nameLen:指定地址结构的长度;
函数返回值:成功返回0;失败返回一个SOCKET_ERROR,错误信息可通过WSAGetLastError函数返回;
通信地址包括结构体:
struct sockaddr --主要用于做函数的参数,不负责存储数据;
struct sockaddr {
unsigned short sa_family; //指定地址族
char sa_data[14]; //要求一块内存分配区,起占位作用
};
struct sockaddr_in --负责存储网络通信的地址数据
struct sockaddr_in{
short sin_family; //指定地址族
unsigned short sin_port; //端口号
struct in_addr sin_addr; //主机IP地址
char sin_zero[8];
};
注:若本地机器具有多个网卡,则每个网卡均有自己的IP地址,可将IP地址指定为INADDR_ANY,允许向分配给本地机器的各个IP地址发送或接收数据;
3--监听(listen)
int listen ( SOCKET s, int backlog );
s:套接字;
backlog:SOMAXCONN,设置等待队列的最大长度(可接收的请求个数);
4--等待客户端连接并接受(accept)
SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen );
s:套接字;
addr:指向一个缓冲区,该缓冲区用来保存服务器端接受的发起连接的客户端的IP地址信息和端口信息;
addrlen:返回包含地址信息的长度;
函数返回值:成功返回socket描述符;失败返回一个INVALID_SOCKET值,错误信息可通过WSAGetLastError函数返回;
5--数据收发(send/recv)
int send ( SOCKET s, const char FAR * buf, int len, int flags );
s:套接字;
buf:指向一个缓冲区,该缓冲区包含将要传递的数据;
len:缓冲区的长度;
flags:设为0;
int recv ( SOCKET s, char FAR* buf, int len, int flags );
s:套接字;
buf:指向一个缓冲区,用来保存接收的数据;
len:缓冲区的长度;
flags:设为0;
6--关闭socket
int closesocket ( SOCKET s );
通过netstat -an,查看网络端口状态
3.2-TCP客户端
1--创建客户端socket
2--连接服务器,如果是本机 inet_addr("127.0.0.1");
int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen );
s:套接字;
name:设定连接的服务器端地址信息;
namelen:指定服务器端地址的长度;
3--数据收发(send/recv)
4--关闭socket
4.UDP通信
4.1-UDP服务器
1--创建服务器端socket
2--绑定IP地址和端口(bind)
3--数据收发 recvfrom/sendto
int recvfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen );
s:套接字;
buf:指向一个缓冲区,用来接收数据;
len:缓冲区的长度;
flags:设为0;
from:指向地址结构体,用来接收发送数据方的地址信息;
fromlen:调用前须给一个初始值,函数调用后会返回地址结构的大小;
int sendto ( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen );
s:套接字;
buf:指向一个缓冲区,包含将要发送的数据;
len:指定缓冲区中数据的长度;
flags:设为0;
to:可选指针,指定目标套接字的地址;
tolen:参数to指定的地址的长度;
4--关闭socket
4.2-UDP客户端
1--创建客户端socket
2--数据收发 sendto/recvfrom
3--关闭socket
5.IP地址格式和端口格式的转换
5.1-IP地址格式的转换
将点分十进制的IP地址转为十六进制的格式:
unsigned long inet_addr ( const char FAR * cp );
将IP地址从十六进制转为点分十进制的格式:
char FAR * inet_ntoa ( struct in_addr in );
5.2-端口格式的转换
将本机端口的整数格式转为TCP/IP网络整数格式:
u_short htons ( u_short hostshort ); //16位
u_long htonl ( u_long hostlong ); //32位
将端口的网络整数格式转为本地端口的整数格式:
u_short ntohs ( u_short netshort );
5.3-主机名<-->IP地址
5.3.1主机名转换为IP地址
函数gethostbyname从主机数据库中获取主机名相对应的IP地址;
struct hostent FAR * gethostbyname ( const char FAR * name );
name:指向一个主机名字符串;
返回值:函数返回hostent结构体类型的指针,该结构体类型的定义如下:
struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
};
该结构体的最后一个成员h_addr_list是一个指针数组,它的每个元素都是一个字符指针,指向内存中存放的一个个点分十进制表示的主机IP地址,一台主机可能会有多个IP地址;
5.3.2IP地址转换为主机名
函数gethostbyaddr将根据指定的IP地址获取相应的主机信息;
struct HOSTENT FAR * gethostbyaddr (
const char FAR * addr,
int len,
int type
);
addr:是一个指向点分十进制类型的IP地址的指针;
len:地址长度;对于AF_INET地址族,长度必须为4个字节;
type:地址类型,Windows平台下必须设为AF_INET;
返回值:函数也是返回hostent结构体类型的指针,结构体中的h_name数据成员就是主机名;
转载于:https://www.cnblogs.com/zhouwanqiu/p/6919282.html
使用基本的socket函数相关推荐
- socket()函数详解!
函数原型 socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套接字的文件描述符 ...
- socket函数介绍
文章目录 1 socket函数介绍 1 socket函数介绍 #include <sys/types.h> /* See NOTES */ #include <sys/socket. ...
- C语言 socket listen()函数(socket()函数创建的socket(套接字描述符)默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)
摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被 ...
- C语言socket()函数解析(创建套接字)af地址族,ip地址类型(Address Family)INET(Inetnet)PF(Protocol Family)
文章目录 Linux 下的 socket() 函数 1) af 为地址族(Address Family),也就是 IP 地址类型 2) type 为数据传输方式/套接字类型 3) protocol 表 ...
- python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)
文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...
- socket()函数用法详解:创建套接字
不管是 Windows 还是 Linux,都使用 socket() 函数来创建套接字.socket() 在两个平台下的参数是相同的,不同的是返回值. 在<socket是什么>一节中我们讲到 ...
- linux c之解决使用socket函数返回为0的问题
1.问题: 在 linux 平台下 写socket,实现简单的tcp通信,服务端第一次调用 socket函数返回 0 2.找原因: 我的代码是这样写的 if ((server_sockfd = soc ...
- 三次握手 四次握手 与socket函数的关系
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...
- python中用socket检测端口_python基于socket函数实现端口扫描
本文实例为大家分享了python基于socket实现端口扫描的具体代码,供大家参考,具体内容如下 自学Python一段时间,写个端口扫描器练练手.有什么不足之处,请见谅 这是基于socket函数对端口 ...
- Python批量检测服务器端口可用性与Socket函数使用
socket函数 简述 socket又称套间字或者插口,是网络通信中必不可少的工具.有道是:"无socket,不网络".由于socket最早在BSD Unix上使用,而Unix/L ...
最新文章
- iOS获取webView的内容或修改网页上的内容
- linux 三大利器 grep sed awk sed
- Cocos Creator实战教程(5)】——打砖块(物理引擎,碰撞检测)
- Java8中使用以下类计算日期时间差:Period、Duration、ChronoUnit
- 【DotNetMLLearn】.NET Core人工智能系列-概述
- Linux 命令之 xz -- POSIX 平台的具有高压缩率的压缩工具
- java炫舞_Java 炫舞按键功能 DancingPlay (整理)
- 随想录(docker应用)
- 用Java设计一个通讯录,保存读者的信息。
- 最好用的个人财务管理工具 Money Pro 2.7.4中文版
- php网络编程socket通讯
- R语言dplyr入门到进阶
- 数字图像处理——第三章 灰度变换与空间滤波
- carbon安装win7 thinkpad x1_ThinkPad X1 carbon笔记本Win7重装系统步骤详细教程。 重装系统...
- 计算机硬件系统的五大基本组成部分分别是,计算机的硬件系统由几大部分构成,分别包括哪些硬件,基本功能是什么?...
- 怎样设置一个函数C语言,C语言中怎样编写一个函数 如何在C语言中定义一个函数?...
- 习题4-10 猴子吃桃问题
- PS色彩算法理解记录 4 Screen
- jacob解决freemaker下载的word文档手机无法打开问题
- 小项目不适合微服务?别扯犊子了!
热门文章
- html canvas抽奖,HTML5 Canvas圆盘抽奖应用(适用于Vue项目)
- 湖南网络推广教大家如何“挽回”网站被降权的排名和权重?
- 网络推广离不开关键词的精准挖掘
- 网络推广——网络推广优化基础问题必须明确
- 网站被k不要慌,看看“老油条”们是怎么解决的吧!
- 注重网站用户体验优化就要避开前方弯道
- 浅析SEO网站优化的三点高质量外链优化技巧
- mysql error manager,MYSQL Starting MySQL. ERROR! Manager of pid-file quit without updating file
- MiguelCatalan/MaterialSearchView
- 机器学习 不均衡数据的处理方法