C 语 言 设 计 一 个 Windows Socket

Windows Socket网络编程——第二章 Windows Socket概念 第二章 Windows Sockets的概念 2.1 OSI网络模型 OSI(Open SystemInterconnect)网络模型,即开放系统互连网络模型,其组成结构如下图所示。              7 应用层                提供用户接口、实现应用所需的服务(例如,文件传输、电子邮件、终端仿真等)。 6 阅读详情

对程序员来说,可以把socket看成一个文件指针,只要向指针所指的文件读写数据,就可以实现双方通信。利用socket进行通信,有两种主要方式。

 

第一种是面向连接的流方式,两个通信的应用程序之间先要建立一种连接链路,数据才能被正确传送接收。这种方式对应的是TCP协议。特点是:通信可靠,对数据有校验和重发机制,通常用作数据文件的传输,如ftp、telnet。

 

第二种是无连接的数据报文方式,这时两台计算机像是把数据放在一封信里通过网络寄给对方,信在传输过程中可能会残缺不全,而且后发的信可能会先被收到,对应的是UDP协议。由于取消重发校验机制,能够达到较高的通信速率,可以用作一些对数据可靠性要求不高的通信,如实时语音,图像传送,广播信息。

 

在ISO的OSI网络七层协议中,WINSOCK主要负责是控制数据的输入输出,也就是传输层和网络层,屏蔽了数据链路层和物理层,给windows下的网络编程带了巨大变化。

 

l         WINSOCK的编程特点

 

网络通信中,由于网络拥挤或一次发送的数据量过大等原因,经产会发生交换的数据在短时间内不能传送完,收发数据的函数因此不能返回,这种现象叫阻塞。WINSOCK对有可能阻塞的函数提供两种处理方式:

 

1.         阻塞方式:收发数据的函数在被调用后一直要到传送完毕或者出错才能返回,期间,除了等待网络操作的完成不能进行任何操作。用户可能会因为长时间等待而关闭主窗口。

2.         非阻塞方式:函数被调用后立即返回,当网络操作传送完成后由WINSOCK给应用程序发送一个消息通知操作完成,可以根据发送的消息传出的参数判断操作是否正常。

 

l         WINSOCK基本的API

 

WSAStartup():初始化

函数原型:

int PASCAL FAR WSAStrartup(WORD wVersionRequest,LPWSADATA  lpWSAData);

 

windows socket由DLL形式提供,为了完成一系列初始化操作,每一个使用windows socket的应用程序必须进行WSAStartup()调用,只有完成成功的调用后才能使用socket。

 

wVersionRequest :欲使用的windows socket API版本,这是一个WORD类型的整数,它的高位字节定义是次版本号,低位是主版本号。

 

lpWSAData:指向WSDATA资料的指针。

 

传回值:0表示成功,失败返回其它相应结果(失败的原因)。

 

Socket():创建一个Socket

函数原型:

SOCKET Scoket(int af, int type, int proctocol);

 

该函数功能与文件操作中的fopen类似。

 

af是address family。一般填写AF_INET 表示是在Internet上的socket;type是socket的类型,当采用流连接方式时写SOCK_STREAM,用数据报文方式写SOCK_DGRAM。proctocol一般为0,表示对两种类型的socket分别采用默认的TCP和UDP传输协议。函数返回值是WINSOCK定义的一种数据类型SOCKET,实际上是个整形数据,创建成功时,返回WINSOCK分配给程序的socket编号,后面调用传输函数,可以把它当作指针一样引用。创建失败返回INVALID_SOCKET。

 

bind():为创建socket指定通信对象。

函数原型:

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

 

成功创建socket后,就应该选定通信对象。首先是自己的程序要与网上的哪台计算机通话;其次在多任务时,该台计算机可能会有几个程序在工作,必须指定要与哪个程序通信。前者可通过网络IP来确定,后者通过端口号确定。端口号表示同一台计算机上不同的应用程序,可以在0-65535之间任选,在编制自己通信程序时,应指定端口号大于1024。TCP——21,UDP——69。

 

s:上一步创建好的套接字。

name:描述通信对象地址信息的结构体的指针,namelen是该结构体的长度。

 

struct socketadd_in{

      short  sin_family;    //一套地址族,通常设置为AF_INET(表示Internet上的socket)

      unsigned short  sin_port;  //端口号

      struct  in_addr;     //IP地址

      char   sin_zero[8];

}

//使该结构大小和SOCKADDR结构大小相同(SOCKADDR是一个无符号short型和长度为14的char型数组构成),sockadd_in加入这个数组长度也是16,目的是方便于地址操作。

 

IP地址in_addr的定义如下:

 

struct in_addr{

     union  {

          struct{

              unsigned char s_b1;

                   s_b2,s_b3,s_b4;

              }  S_un_b;

          struct{

              unsigned short  s_w1, s_w2;

              }  S_un_w;

          unsigned long S_addr;

        } S_un;

};

 

对一个IP地址是“10.14.25.90”sockaddr_in结构中的sin_addr可以被这样几种方法赋值:

M1:

sin_addr.S_un.S_un_b.s_b1=10;

sin_addr.S_un.S_un_b.s_b2=14;

sin_addr.S_un.S_un_b.s_b3=25;

sin_addr.S_un.S_un_b.s_b4=90;

M2:

sin_addr.S_un.S_sun_w.s_w1=(14<<8)|10;

sin_addr.S_un.S_sun_w.s_w2=(90<<8)|25;

M3:

sin_addr.S_un.S_addr=(90<<24)|(25<<16)|(14<<8)|10;

 

listen():设置等待连接状态

函数原型:

int listen(SOCKET s, int backlog);

 

对于服务器的程序,当申请到socket,并指定通信对象为INADDR_ANY之后,就应该等待一个客户机的程序要求连接,listen()就是把一个socket设置这种状态的函数。backlog表示等待连接队列长度,可取1-5,如果服务器已经和其它客户程序连接,则后来这个连接被放在队列中,等待服务器空闲的时候连接。当队列达到指定长度backlog,再来连接会被拒绝。

 

accept():接收连接请求。

函数原型:

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

 

接收到连接后,会为这个连接建立一个新的socket用来与对方通信,并把它作为返回值,新建的socket与原来的socket有相同的特性,包括端口号,而原来的socket被释放,用于等待其它连接请求。新的SOCKET才是与客户端通信的实际的SOCKET。所以参数中SOCKET称为监听SOCKET,负责连接,而accpet返回的SOCKET成为会话SOCKET。addr和addrlen返回客户机的sockaddr_in结构体。

 

connect():请求建立连接。适用于客户机。

函数原型:

int connect (SOCKET s,struct sockaddr_in * name, int namlen);

 

send()/recv():发送接收数据

函数原型:

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

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

 

s是连接的socket,buf和len是发送接收的数据包及其长度。flags一般为0。recv()实际上是接收send()的数据包,当读到的数据字节少于规定接收的数目时,就把数据全部接收,返回实际字节数。当多于规定值时,流方式下,剩余字节由下一个recv()读出;在数据报文方式下,多余数据将被丢弃,这两个函数出错返回SOCKET_ERROR。

 

数据报文方式通信的socket,由于事先不建立连接,所以跳过了connect()而直接调用以下方式:

 

int recvfrom (SOCKET s,char *buf, int len, int flags,struct sockaddr_infrom,int *fromlen);

int sendto   (SOCKET s, char *buf,  int len,  int flags, struct sockaddr_into, int *tolen);

 

from,fromlen,to,tolen分别表示接收发送数据对象。

 

closesocket():关闭socket

函数原型:

closesocket(SOCKET s);

 

通信结束,关闭socket。

 

【socket】C语言的Socket网络编程 目录 Socket网络编程 1、网络知识 网络中进程之间如何通信? 什么是Socket? socket一词的起源 怎么理解端口? 怎么理解socket ? 2. 客户/服务器模式 2.1 服务器端: 2.2 客户端: 4. 套接字函数 4.1 创建套接字──sock... 阅读详情

相关推荐

C/C++ socket套接字详解(Windows)

一、编译环境本篇博客是在windows系统下的CodeBlocks环境下编写而成的,Linux系统以及其他编译环境暂不适用关于如何CodeBlocks如何安装和配置,可以参考链接(转自萤火虫塔莉):CodeBlocks的安装以及编译器的配置...

CRC的博客 1万+

winpcap 获取数据链路层类型

#include #include #include /*  * 获取数据链路层类型  */   /*  * pcap_lookupdev介绍  * NAME        pcap_lookupdev - find the default device on which to capture SYNOPSIS        #include        ch

herelsp 1284

Windows C/C++ Socket 编程

作者很懒,本文没有摘要。

Jackey_Song的博客 2263

Windows下C语言的Socket编程例子(TCP和UDP)

刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket程序例子,开发环境是vc6: 首先是TCP server端: [cpp] view plain copy #include "stdafx.h"   #include    #include       #pragma comment(lib,"ws2_32

ccfxue的博客 5073

Windows socket C语言编程

Windows socket C语言编程函数详解 文章目录Windows socket C语言编程函数详解WSADATAWSAStartupsocketsockaddrsockaddr_ininet_ptonsetsockoptbind()connect()recvfromsendto() WSADATA 用来存储被WSAStartup函数调用后返回的[Windows Sockets](https...

lanshi00的博客 848

纯C下Windows Socket编程之TCP

C 语言Windows socket编程笔记 最近学习了如何在Windows平台下使用c语言进行socket编程,理了下思绪,笔记如下。 语言标准:c99 编译器 :gcc TCP 1.使用socket通信过程 建立socket。 将socket绑定到一本地地址。 服务端: 监听是否有连接请求 接受一个连接请求同时保

qq_16774111的博客 1492

windows 下C语言socket编程

之前一直在Linux系统开发C语言的socket,由于项目的需要 需要在windows下开发,第一次在windows下开 发,顺便记录下来。 首先socket的通信流程: Server程序: 1 .创建socket:socket(); 2. 绑定socket的IP+端口号:bind(); 3.监听端口号:listen(); 4.接收客户端的连接请求:accept(); 5.读写客...

fly_sky_share的博客 6381

Windows下实现C语言Socket通讯TCP传送结构体信息

版权声明:本文为博主原创文章,未经博主允许不得转载 Windows下实现C语言Socket通讯 <TCP传送结构体信息> 首先socket通信的步骤: 三次握手协议 三次握手协议 代码 服务器端 #include <stdio.h> #include <WinSock2.h> #include...

qq_36082072的博客 1533

Windows下C语言的基于TCP的Socket编程

Windows下C语言的基于TCP的Socket编程 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 注意在windows平台是需要winsock2.h头文件的,不像在linux平台的socket编程,mac的话是有些问题满意后有时间就来解决一下 必须记载动态链接库:ws2_32.lib 如果你用的是Clion,里面...

归子莫的博客 2720

【Socket编程】套接字Windows平台C语言实现

Socket API在windows平台下的基础代码。

卢超群的实验室 3336

跨平台(Windows+Linux)的Socket通讯程序(一)—底层封装

【摘要】编写Socket通讯程序是一个老话题。本文重点介绍Windows平台和Linux平台Socket通讯的不同,采用C++,编制了一个简单的跨平台的Socket通讯库。 一、Socket通讯的基础知识 Socket通讯是两个计算机之间最基本的通讯方法,有TCP和UDP两种协议。关于这两种协议的区别,不少文章已有详述,这里,稍微总结一下: 1.TCP是面向连接的,是“流”式的,意即通讯两端

guxch的专栏 3万+

Windows下C语言socket编程

在Windows下利用C语言实现socket通信,刚开始学习,记录自己的学习过程,如果出现错误还望各位大佬指点一二。 一、原理 1.socket()函数 int socket(int domain, int type, int protocol); domain:协议域,决定了socket的地址类型,在通信中必须采用对应的地址。 type:指定socket类型。常用的socket类型...

ve_forever的博客 3277

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 137

c在Windows下的socket编程

原文出自:http://blog.youkuaiyun.com/hongchangfirst c语言虽说是跨平台的,可以一次编写,处处编译,处处运行。但是在socket方面显然不是,这里有很多原因。习惯了Linux c socket编程,在Windows下c的socket编程又不太一样,我们还得重新编写相关代码,不过道理都是相通的。 首先包就不一样: #include     #pragma   co

hongchangfirst 1685

Codesys.运动控制修改凸轮点

通过改凸轮曲线的主从轴缩放比例或者偏置。 新建多个凸轮曲线,对CAM曲线进行切换。 程序中动态修改,仅修改中间的关键点(凸轮末点修改or凸轮曲线运行中修改)。 程序中动态修改,修改首未关键点及关键点个数,需要重新触发MC_TableSelect。 使用程序新建凸轮表代码,实现电子凸轮基本运动。 我们讲的凸轮表切换、关键点修改、程序新建电子凸轮,这些方法没有本质区别,总之都是“趁曲线不注意,把凸轮表改了。

傻响雨 6826

卷积码和Turbo码

通信原理相关博文目录:目录我们常在移动通信中遇到的卷积码就是一种非分组码,卷积码和信号处理中的卷积运算有关系吗?是不是就是信号处理中的卷积运算,先看看编码器的编码原理再说:下面是一个比较实用的卷积码编码器:它有三个移位寄存器D0,D1,D2和三个模2加法器,以及一个旋转开关组成,编码前,先将各级移位寄存器清零:现在假设输入的信息码元是1101:当输入的第一个码元为1时,三个模2加法器计算的结果都为...

Reborn Lee 2万+

windows下socket编程的原理与分步实现

前言 前几年写过socket编程,后面很久不用就忘记了这块技术。最近在研究msf payload的执行原理,又得用到socket编程的技术,于是就有了这篇文章。 这篇文章跟msf中的技术没多少关系,属于一篇基础文章,看懂这篇文章后继续看msf payload原理就会有一种茅塞顿开的感觉。 windows下socket编程的特点 相比较于基于python的socket编程,windows下的socket编程十分复杂。需要多个步骤,还需要设置多个数据结构。 python 只需要两行: 而c语言需要很多很

Shanfenglan's blog 28万+

【第4章 光模块实测方法总结(环境搭建、眼图测试、接收测试、注意事项)】

本文系统介绍了光模块测试的完整流程与关键要点,涵盖低速模块到3.2T PAM4超高速模块的测试方法。内容包括:1)测试环境搭建(光路/电路要求);2)核心测试项目(眼图分析、接收灵敏度/饱和测试、误码压力测试);3)PAM4专项测试(TDECQ、RLM线性度等);4)可靠性测试(温循、电压、老化);5)八大注意事项(如禁止脏端面测试、长短距混插等)。特别强调高速模块对测试环境的高敏感性,需重点关注波形质量而非单纯光功率,并需进行严格压力测试才能暴露潜在问题。

学无止境 434

windows C/C++ socket (一对一)

白话三次握手: client 我要连接上来了server server 我准备好, 你连吧, 告诉我下我好确认 client 我连上来了 四次挥手: client 我断开了server server: 别呀,我数据还没收完; server: 完了, 你断开吧, 通知我下我好确认 client: 好的, 我断开了server 简单列子: ///tcp /////////...

网瘾少年丶的博客 1085

PyTorch生成式人工智能——VQ-VAE详解与实现

VQ-VAE (Vector Quantised-Variational AutoEncoder) 的核心思想就是将 VAE 的连续潜变量离散化。它通过学习一个码本 (Codebook) 来实现这一点,码本是一个包含有限个嵌入向量的字典。模型不是直接输出一个连续的潜在向量,而是从码本中找出与编码器输出最接近的嵌入向量来代替它。本节首先详细讲解 VQ-VAE 的技术原理,然后使用 PyTorch 从零开始实现 VQ-VAE 模型。

盼小辉丶的博客 3276

【linux】linux 出现一个网卡绑定多个ip怎么处理

我的原因是我使用了dhcp,这个会自动分配ip, 将 BOOTPROTO 参数由 dhcp 改为 static,并移除或注释掉与动态分配地址 10.0.2.15 相关的配置行(如果存在)。执行后,您可以再次使用 ip -4 a 或 ifconfig 命令确认 IP 地址已被移除。输出可以看出,您的虚拟机(k8s003)中存在一个名为 enp0s3 的网卡绑定了多个 IPv4 地址。对于某些 Linux 发行版(如 Ubuntu、Debian),您可能需要编辑网络接口的配置文件来移除多余的 IP 地址。

九师兄 297
上一篇: Windows Sockets
下一篇: Beej’s网络编程向导
发现心流
博客等级 码龄20年 52粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值