win32/linux下网络编程十点需要注意的地方(转)

5 篇文章 1 订阅
4 篇文章 0 订阅
书上看到的,有几点觉得还是值得注意。
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值