书上看到的,有几点觉得还是值得注意。
1、头文件
win32: #include<winSock.h>
linux: #include<sys/socket.h>
2、关闭
win32: closeScoket(s);
linux: close(fd);
3、在NONBLOCKING模式下调用connect,大部分返回
win32: WSAEWOULDBLOCK
linux: EINPROGRESS
表示正在连接
4、scokadrr的长度单位
win32: int
linux: socklent_t
5、获取当前执行线程上的错误
win32: WSAGetLastError()
linux: errno
6、控制I/O模式函数
win32: ioctlsocket()
linux: ioctl();
7**、对于NONBLOCKING模式下调用connect后的成功判定。
win32: 调用select()时,该socket处理writefds中,并且不在exceptfds中,就表示连接成功。
linux: a连接成功时,该socket可写;b连接建立错误时,该socket即可读也可写。
解决方式是:当发现soket可写时,调用getsockopt()检测是否有错误发生。
bool foo() {
bool ret = false;
int err, len;
if( getsockopt( socket, SOL_SOCKET, SO_ERROR, (void*)&err, (socklen_t*)&len ) > 0 )
{ if( err == 0 ) ert = true; }
return ret;
}
8**、对已经关闭的soket调用send()
win32: 返回错误,没其他后果。
linux: 产生信号SIGPIPE,linux对该信号的默认操作是关闭进程
解决方法:预先注册SIGPIPE信号,
#include <signal.h>
void sig_pipe(int signal) { /* 处理 */ }
在程序启动时,进行注册
signal(SIGPIPE, sig_pipe);
9**、在监听socket设置了NONBLOCKING模式下,通过accept()产生的新的soket问题
win32: 会继承监听socket的属性
linux: 不会继承,必须手动设置NONBLOCKING模式,SetNonblocking(int fd);
10**、linux下,如果一个进程帮定某个port,那当进程结束时,该port仍然会被继续占用几十秒,在这段时间内尝试对该port的绑定都会返回失败。
解决方法:调用setsockopt()启用SO_REUSERADDR属性
bool foo() {
bool ret = false;
int opt = 1, len = sizeof(opt);
if( setsockopt( socket, SOL_SOCKET, SO_REUSERADDR, (const void*)&opt, len) > 0 )
{ ret = true; }
return ret;
}
socket相关程序从windows移植到linux下需要注意的
1。头文件
windows下winsock.h/winsock2.h
linux下sys/socket.h
2。初始化
windows下需要用WSAStartup
linux下不需要
3。关闭socket
windows下closesocket(...)
linux下close(...)
4。类型
windows下SOCKET
linux下int
5。获取错误码
windows下getlasterror()/WSAGetLastError()
linux下errno变量
6。设置非阻塞
windows下ioctlsocket()
linux下fcntl()
7。send函数最后一个参数
windows下一般设置为0
linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。
8。毫秒级时间获取
windows下GetTickCount()
linux下gettimeofday()
分享到:
相关推荐
笔者从事汇编编程已经有十几年的历史了,从8086时代的DOS汇编编程开始到当前的Win32汇编编程,从一个初学者到现在能利用Win32汇编来解决大部分编程需求,中间也经过了很长时间的摸索和大量的挫折,所以笔者很清楚...
不过目前大多数较新的Linux发行版本(包括红旗 Linux、中软Linux、Mandrake Linux等)都可以自动挂装文件系统,但Red Hat Linux除外。 umount 1.作用 umount命令的作用是卸载一个文件系统,它的使用权限是超级...
它们提供了足够的可编程特性(变量、流程控制和过程),使你可以将现有程序组装成符合自己需要的复杂的脚本程序。Shell程序非常适用于一些日常任务的自动化处理工作。 Tcl解释器可以很容易地添加到你的应用程序中,...
一个进程池的服务器程序 ... 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子进程accept(listenfd),即所有子进程竞争accept请求。...
win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...
win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...
win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...
win32情况下实现媒体播放。 preemptivepopupkiller C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用...
win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...
win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...
候不点enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但 是事实是这样的吗?如果你此时对程序进行了改动,再次按下run 按钮,你会发 现又出现了error: collect2: ld returned 1 exit status 的错误...
在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...
执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持新版HOTKEY。 2013-07-10 1.insmod现在支持长文件名(以前最多11个字符,现在没有限制). 2....
3.7.2 Win32子系统 104 3.8 结构化异常处理 105 3.9 结论 107 第4章 逆向工具 109 4.1 不同的逆向方法 110 4.1.1 离线代码分析 110 4.1.2 现场代码分析 110 4.2 反汇编器——ILDasm 110 4.3 调试器 116 4.3.1 用户...