Windows Socket和Linux Socket编程的区别

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、一些常用函数的移植 

http://www.vckbase.com/document/viewdoc/?id=1586

2、网络 

socket相关程序从Windows移植到Linux下需要注意的:

1)头文件 

Windows下winsock.h/winsock2.h 
Linux下sys/socket.h 
错误处理:errno.h

2)初始化 

Windows下需要用WSAStartup 
Linux下不需要

3)关闭socket 

Windows下closesocket(...) 
Linux下close(...)

4)类型 

Windows下SOCKET 
Linux下int 
如我用到的一些宏: 

#ifdef WIN32 typedef int socklen_t; typedef int ssize_t; 
#endif#ifdef __Linux__ typedef int SOCKET; typedef unsigned char BYTE; typedef unsigned long DWORD; 
#define FALSE 0 
#define SOCKET_ERROR (-1) #endif

5)绑定地址的结构体

名称相同,都是struct sockaddr、struct sockaddr_in,这两者通常转换使用;

在Windows下面名称都是大写,而在Linux下为小写

常用:

Linux下:

sockaddr_in destAddr;destAdd.sin_family=AF_INET;
destAddr.sin_port=htons(2030);
destAddr.sin_addr.s_addr=inet_addr("192.168.1.1");

Windows下:

SOCKADDR_IN destAddr;
destAddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.1");

但结构体中成员的名称不同

Windows中结构体成员

struct sockaddr_in {short   sin_family;u_short sin_port;struct  in_addr sin_addr;char    sin_zero[8];
};
struct sockaddr {u_short    sa_family;char       sa_data[14];
};
struct in_addr {union {struct { u_char s_b1,s_b2,s_b3,s_b4; }   S_un_b;struct { u_short s_w1,s_w2; }            S_un_w;u_long                                   S_addr;} S_un;
};

下面的一些宏可以使windows下的程序移植到linux下(通过类型的重新定义,使代码具有linux和windows下的移植性)

 

5)获取错误码 

Windows下getlasterror()/WSAGetLastError() 
Linux下errno变量

6)设置非阻塞 

Windows下ioctlsocket() 
Linux下fcntl() <fcntl.h>

7)send函数最后一个参数 

Windows下一般设置为0 
Linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。

8)send函数最后一个参数 

windows下一般设置为0 
linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。 

 

9)毫秒级时间获取 

Windows下GetTickCount() 
Linux下gettimeofday()

10)数据类型的一些转化

通用的:
小端到大端(网络协议使用)的转换:htonl, htons 
点分十进制IP和整数之间的相互转换:inet_addr()(该函数将点分十进制转为整数),inet_aton(),inet_ntoa(),inet_pton()(linux下独有  该函数可以实现相互之间的转换)
使用到的头文件不相同,linux下用man命令查询。

另外注意:
linux下使用的套接字为伯克利套接字,因此在select()函数的使用上(第一个参数的设置)也有区别;

windows下为了与伯克利套接字匹配,第一个参数是无所谓,一般可设为0;

int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!

 

 

3、多线程 

 

多线程: (win)process.h --〉(Linux)pthread.h 
_beginthread --> pthread_create 
_endthread --> pthread_exit

 

一、linux下的socket编程:

1、客户端执行步骤依次如下:

socket()

connect()

send()或者recv()

close()

注意的是,connect之前要填充地址结构体,IP地址转换为网络字节序,一般用inet_aton().

2、服务器端:

socket()

bind()

listen()

accpet()

recv()或者send()

close()

(ps:一般通过将send()和recv()的最后一个参数赋为0或者1来区分阻塞与非阻塞,其中0对应阻塞,1对应非阻塞)

二、windows下的网络编程:

做过windows网络编程的人都知道,微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。即windows既提供上层的网络API函数也提供底层的API函数。

1、对于采用上层的API函数而言:若采用csocket类定义一个对象obj的话,那么进行网络编程的步骤如下:

客户端:

obj.Create()

obj.Connect()

obj.Receive()或者obj.Send()

obj.Close()

服务器端:

先调用AfxSocketInit()检测协议栈安装情况

obj.Create()

obj.Listen()

obj.Accpet()

obj.Receive()或者obj.Send()

obj.Close()

2、对于采用底层的API函数而言,步骤如下:

客户端:

WSAStartup()

socket()

connect()

send()或者recv()

closesocket()

服务器端:

WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()

(ps:windows下CSocket类为同步方式,有阻塞现象;CASyncSocket为异步方式,无阻塞现象。)

通过以上比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:

区别一:windows下需加上WSAStartup()函数

区别二:关闭socket:linux为close(),windows为closesocket()

windows下采用上层的API,一般有CSocket和CAsynSocket这两种类型的类

这种情况以下socket函数一般的首字母大写。而底层的API不管是windows下的还是linux下的socket函数首字母都是小写的。

 

socket编程在windows和linux下的区别

转载于:https://my.oschina.net/mickelfeng/blog/1522729

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 C# 开发的现代轻量级 Windows 文本编辑器

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具和组件&#xff0c;希望对您有用&#xff01;Notepads 是一个具有简约设计的现代化轻量级文本编辑器&#xff0c;在 github 上开源&#xff0c;由微软大佬 Jiaqi Liu 开发。开发背…

分布式压测系列之Jmeter4.0第一季

1&#xff09;Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具&#xff0c;apache旗下的开源软件&#xff0c;一开始是设计为web测试的软件&#xff0c;由于发展迅猛&#xff0c;现在可以压测许多协议比如&#xff1a;http、https、soap、ftp、database数据库、LDAP 轻量目…

powershell 查看系统设备\device status

查看设备 $allDevice"C:\Data\soundDevAll.txt" (Get-WmiObject -Class Win32_SoundDevice).Name|Out-File $allDevice device status $deviceInfoGet-WmiObject Win32_PnPEntity| select Name, Status | where {$_.Name -like "$deviceName"} $set…

Fish Shell 使用笔记

安装Fish Shell brew install fish 安装Oh My Fish curl -L https://get.oh-my.fish | fish 安装Fisher curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish 配置 autojump clone autojump git clone https://github.com/wting/autojum…

Entity Framework Core 7中高效地进行批量数据插入

因为之前的版本中&#xff0c;EF Core无法实现高效地批量插入、修改、删除数据&#xff0c;所以我开发了Zack.EFCore.Batch这个开源项目&#xff0c;比较受大家的欢迎&#xff0c;获得了400多个star。从.NET 7开始&#xff0c;微软在Entity Framework Core 7内置了对高效地批量…

Hive学习之路 (一)Hive初识

Hive 简介 什么是Hive 1、Hive 由 Facebook 实现并开源 2、是基于 Hadoop 的一个数据仓库工具 3、可以将结构化的数据映射为一张数据库表 4、并提供 HQL(Hive SQL)查询功能 5、底层数据是存储在 HDFS 上 6、Hive的本质是将 SQL 语句转换为 MapReduce 任务运行 7、使不熟悉 MapR…

angularJs select绑定的model 取不到值

内容结构 一.原因分析 二. 解决办法 一.原因分析 1.由于原型继承的关系&#xff0c;修改父级对象中的someBareValue会同时修改子对象中的值&#xff0c;但反之则不行。2.ng-if 以及 ng-repeat 会创建一个子级作用域&#xff0c;如果在这俩个指令中添加了元素&a…

PS2019摄影后期处理(三)通透....

一、PS可选颜色 在对应颜色进行cmyk加减

(原創) 今天拿到學生證了 (日記)

<原文我在2006/09/07發表在藍色小舖>今天拿到學生證了&#xff0c;終於正式成為台大的學生。第一件事情就是去台大圖書館借了四本書回家看&#xff0c;一次可以借兩個月耶&#xff0c;真不錯。 感覺很複雜&#xff0c;下星期要離開華碩&#xff0c;得繳回識別證&#xff…

os 键盘快捷键截图_如何通过键盘快捷键更有效地使用OS X虚拟桌面

os 键盘快捷键截图() We like having multiple virtual desktops on OS X, especially when we can supercharge them by combining them with a few simple keyboard shortcuts. So, on that note, here are some practical ways to use OS X’s virtual desktops like you me…

旗正规则引擎内存表出错的原因及解决方法

经常我们有一些使用者问到这个问题&#xff0c;关于内存表出错的情况&#xff0c;其实问题不复杂&#xff0c;我这给大家简单的讲一下就明白了&#xff0c;如果还有什么不明白的&#xff0c;其实也都可以问厂家杭州旗正&#xff0c;随时都有人回应的。 1 内存表 1.1 汇总 1.1.1…

Shell脚本之sed的使用

1.sed命令&#xff1b;主要作用是查找&#xff1b;新增 删除 和修改替换。 user.txt daokr#cat user.txt ID Name Sex Age 1 zhang M 19 2 wang G 20 3 cheng M 10 4 huahua M 100 查找命令&#xff1a;-n 和 p&#xff08;prin…

.NET周报【11月第4期 2022-11-30】

国内文章.NET 7 的 AOT 到底能不能扛反编译&#xff1f;https://www.cnblogs.com/huangxincheng/p/16917197.html在 B 站&#xff0c;公众号上发了一篇 AOT 的文章后&#xff0c;没想到反响还是挺大的&#xff0c;都称赞这个东西能抗反编译&#xff0c;可以让破解难度极大提高&…

结合hello world探讨gcc编译程序的过程

本博客&#xff08;http://blog.csdn.net/livelylittlefish&#xff09;贴出作者&#xff08;三二一小鱼&#xff09;相关研究、学习内容所做的笔记&#xff0c;欢迎广大朋友指正&#xff01; 结合"hello world"探讨gcc编译程序的过程 1. gcc简介 gcc/g是GNU工程的C和…

Powershell 时间相关

1.时间相差秒数计算 $start Get-Date Get-HotFix $end Get-Date Write-Host -ForegroundColor Red (Total Runtime: ($end - $start).TotalSeconds)//若开始时间保存为字符串$startTime Get-Date -Format yyyyMMddTHH:mm:ss $startTime[datetime]::ParseExact("$sta…

java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

如题是结论&#xff0c;如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他。下面是代码&#xff1a; package com.test;public class TestClass{// 成员变量赋值第一个执行private static int m11;private int m21;// 静态构造函数第二个执行static{System.out.pr…

Unity的未来,是固守Mono,还是拥抱CoreCLR?

TLDR;Unity坚定的拥抱.NET标准生态&#xff0c;正全速向CoreCLR迁移。Mono vs CoreCLR对于一个C#的初学者&#xff0c;首先要了解的便是.NET和C#的关系。所以这里不再赘述。对于一个Unity的初学者&#xff0c;在使用C#编码的过程中&#xff0c;一定会遇到一些C#新特性不能在项目…

hinton教授的本科生课程CSC321-机器学习中的神经网的笔记

最近一直在看仙守博友所记录的笔记 Hinton的CSC321课程&#xff08;完结&#xff0c;待文字润色&#xff09;&#xff1a; 1、lecture1-NN的简介 2、lecture2-NN结构的主要类型的概述和感知机 3、lecture3-线性神经元和算法 4、lecture4-神经网络在语言上的应用 5、lecture5-对…

ASP存储过程参数数据类型

ASP调用存储过程一般的方法&#xff1a; p.Append cmd.CreateParameter("参数名称",类型,方向,大小) 参许参数值的类型的意义如下&#xff1a; 名称值 整数值 功能 adDBTimeStamp 135 日期时间数据类型 adDecimal 14 十进制整数值 adDouble …

powershell 启动线程与关闭线程

启动线程 $ScreenCapture"C:\ResolutionTool\ScreenCapture.exe" Start-Process $ScreenCapture 关闭线程 Get-Process ScreenCapture| Stop-Process