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

阅读更多

书上看到的,有几点觉得还是值得注意。

1、头文件

win32: #include

linux: #include

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

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()

你可能感兴趣的:(win32/linux下网络编程十点需要注意的地方(收藏一下))