C 语 言 设 计 一 个 Windows Socket

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

对程序员来说,可以把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。

 

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

相关推荐

Windows C/C++ Socket 编程

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

Jackey_Song的博客 2263

socket在windows下和linux下的区别

1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h    错误处理:errno.h 2)初始化 windows下需要用WSAStartup WSADATA wsaData;      err = WSAStartup(0x202,&amp;wsaData);       if ( err != 0 )    {          re...

weixin_34184158的博客 187

Windows socket C语言编程

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

lanshi00的博客 848

socket编程之二:两种链接类型tcp和udp

前面一篇文章说到了一些计算机网络的基础知识,引入了socket,从这节开始,就进入正题了。 一 概率 TCP:Transimission Control Protocol传输控制协议。 UPD:User Datagram Protocol用户数据包协议。 两者都属于上一篇文章说的OSI模型中的第四层——传输层的协议。 两者相比: TCP协议面向连接,UDP协议面向非

寒风的技术博客 2635

纯C下Windows Socket编程之TCP

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

qq_16774111的博客 1492

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

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

qq_36082072的博客 1533

winpcap 获取数据链路层类型

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

herelsp 1284

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

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

卢超群的实验室 3336

Windows下底层数据包发送实战

1、简介   所谓“底层数据包”指的是在“运行”于数据链路层的数据包,简单的说就是“以太网帧”,而我们常用的Socket只能发送“运行”在传输层的TCP、UDP等包,这些传输层数据包已经能满足绝大部分需求,但是有些时候还是需要发送底层数据包的(例如SYN扫描),那么如何发送呢?   本文记录了我试图实现的过程中遇到的一些问题以及解决办法,需要注明:①本文只考虑Windows上的实现 ②本文主...

weixin_30386713的博客 913

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

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

guxch的专栏 3万+

从网格划分到端口接地:一份给ADS新手的Momentum RF仿真避坑实操指南

本文为ADS新手提供Momentum RF仿真的实用指南,涵盖网格划分、端口接地、特殊结构处理等关键设置技巧。通过30-50 cells/λ原则、1/10波长限制等黄金法则,帮助用户平衡仿真精度与效率,避免常见错误,提升电磁仿真结果的准确性。

weixin_33692284的博客 505

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

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计提示:本文采用PHP对数据库进行操作:本文就介绍了PHP实现对MySQL数据库的增删改查操作基础内容。

899

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

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

归子莫的博客 2720

Qt实现思维导图功能5『纵向分布模式』

思维导图纵向分布模式:模式一

浮生流年的博客 1055

可疑物品遗留检测系统:基于YOLOv8的智能安防解决方案

数据采集与标注模块:负责收集和标注可疑物品图像数据模型训练模块:基于YOLOv8算法训练检测模型推理检测模块:加载训练好的模型进行实时检测用户界面模块:提供友好的操作界面和可视化结果展示报警模块:当检测到可疑物品时触发报警机制:包含多种暴力场景和可疑物品SUAVe:监控场景下的异常行为与物品数据集:包含多种可疑物品自建数据集:针对特定场景收集的数据背包(backpack)手提箱(suitcase)无人看管的包裹(package)可疑箱子(box)

YOLO 435

Windows下C语言socket编程

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

ve_forever的博客 3277

2024.12.29 【RNA-seq】Rawdata数据缺失问题与解决方案

Fastq格式是一种用于存储高通量测序数据的文件格式,包含序列和相应的质量信息。第一行以开头,后接序列标识符;第二行是测序的DNA序列;第三行以开头,可能会跟随序列标识符;第四行是对应的质量值,以ASCII字符表示。Rawdata的数据完整性通常情况下是没有问题的,但我们仍然需要对下机数据进行验证,确保后续分析的正常进行,好的分析习惯可以提高整体的分析效率,避免很多不必要的麻烦。

1109

c在Windows下的socket编程

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

hongchangfirst 1685

Linux 命令行的艺术

Linux 命令行的艺术前言基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统仅限 Windows 系统更多资源免责声明熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练...

AI天才研究院 9278

C#的GDI+绘图详解

/消除锯齿 或 AntiAlias。// 1.在窗体或控件的Paint事件中,用PaintEventArgs e 创建绘图对象 ---- 控件或窗体重绘时。//为控件创建绘图对象。//--------------------以上方法三选一。//2.创建绘图对象 panel1中绘图。

weixin_50920631的博客 3457

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

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

Shanfenglan's blog 28万+

【C++】开源:ncurses终端TUI文本界面库

ncurses配置使用(TUI)

DevFrank的博客 3164

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

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

网瘾少年丶的博客 1085

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值