Linux 和 Windows Socket编程的区别
来源:互联网 发布:淘宝 论文代发 卓越 编辑:程序博客网 时间:2024/05/17 23:45
最近写一个项目,需要在Linux 和 Windows 两个主要平台编写网络Socket,找了一下没有兼容库,所以查找了一下这两个平台的Socket的一些区别,方便移植的用。
1、头文件:
#include <winsock.h> or #include <winsock2.h>
#include <sys/socket.h>
- 添加#program comment(lib,"Ws2.lib")
- 默认windows.h文件会包含winsock.h,当你包含winsock2.h就会冲突。要解决这个问题,需要首先包含winsock2.h,然后再包括windows.h,要注意包含的顺序。
2、socket初始化与关闭:
Windows需要 WSAStartup(),closesocket(...)函数
Linux不需要初始化,结束socket用close(...)
3、类型声明:
SOCKET
int
- 在Windows里将SOCKET宏定义成unsigned int
4、错误返回码:
windows下getlasterror()/WSAGetLastError()/SOCKET_ERROR
linux下errno变量
- SOCKET_ERROR=-1
5、设置非阻塞:
ioctlsocket(server_socket,FIONBIO,&ul);
ioctlsocket在Linux中没有定义,用fcntl替代即可,但要包含fcntl.h头文件。
#include <fcntl.h>
fcntl(server_socket,F_SETFL, O_NONBLOCK);
6、send函数最后一个参数:
windows下一般设置为0
linux下最好设置为MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。如果不设置,在发送出错后有可能会导致程序退出。
一、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下的网络编程:
客户端:
WSAStartup()
socket()
connect()
send()或者recv()
closesocket()
服务器端:
WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()
通过以上比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:
区别一:windows下需加上WSAStartup()函数
区别二:关闭socket:linux为close(),windows为closesocket()
- Linux 和 Windows Socket编程的区别
- Windows Socket和Linux Socket编程的区别
- Windows Socket和Linux Socket编程的区别
- windows Socket和Linux Socket编程的区别
- Windows Socket和Linux Socket编程的区别
- Windows Socket和Linux Socket编程的区别
- Windows Socket和Linux Socket编程的区别
- Windows Socket和Linux Socket编程的区别
- socket编程在windows和linux下的区别
- socket编程在windows和linux下的区别
- socket编程在windows和linux下的区别
- Linux和windows下socket编程的一点区别
- 【转】socket编程在windows和linux下的区别
- linux和windows下socket编程的一点区别
- Windows 与 Linux Socket 编程的区别
- Windows Socket和Linux Socket编程有什么区别
- windows socket编程和linux socket编程的异同
- Socket Linux和Windows下的区别
- iOS项目中调用C/C++库中的函数注意事项
- Unity手游之路<九>自动寻路Navmesh之高级主题
- linux下main(argc,argv[])中shell的&应用
- 三种内存分配方式
- 进程环境
- Linux 和 Windows Socket编程的区别
- Ruby 学习 #笨办法学ruby# 习题11 gets和gets.chomp的区别
- Valgrind使用说明
- 三大WEB服务器对比分析
- 广播接收者的使用
- 百度二面面经及总结
- logback 常用配置详解(二)<appender>
- Netty 之 AttributeMap属性
- Sencha Touch开发心得分享