Windows Socket和Linux Socket编程的区别

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值