windows Socket和Linux Socket编程的区别

转载 2013年12月02日 16:16:49

http://blog.csdn.net/wxqian25/article/details/8252661

SOCKET在原理上应该是一样的,只是不同系统的运行机置有些不同。

Socket 编程 windows到Linux代码移植遇到的问题

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 

其他常用函数的头文件可到命令行下用man指令查询。

2)初始化

windows下需要用WSAStartup

linux下不需要(很方便),直接可以使用

3)关闭socket

windows下closesocket(...)

linux下close(...)

4)类型

windows下SOCKET

在linux下为int类型

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下的移植性)

  1. #ifdef WIN32  
  2. typedef int socklen_t;  
  3. typedef int ssize_t;  
  4. #endif   
  5.   
  6. #ifdef __LINUX__  
  7. typedef int SOCKET;  
  8. typedef unsigned char BYTE;  
  9. typedef unsigned long DWORD;  
  10. #define FALSE 0  
  11. #define SOCKET_ERROR (-1)  
  12. #endif   
  1. #ifdef WIN32  
  2. typedef int socklen_t;  
  3. typedef int ssize_t;  
  4. #endif   
  5.   
  6. #ifdef __LINUX__  
  7. typedef int SOCKET;  
  8. typedef unsigned char BYTE;  
  9. typedef unsigned long DWORD;  
  10. #define FALSE 0  
  11. #define SOCKET_ERROR (-1)  
  12. #endif   
6)获取错误码
windows下getlasterror()/WSAGetLastError()
linux下errno变量
7)设置非阻塞
windows下ioctlsocket()
linux下fcntl() <fcntl.h>
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

socket编程在windows和linux下的区别

如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境。   下面大概分...
  • jeakon
  • jeakon
  • 2013年06月23日 11:13
  • 2919

socket网络编程中read与recv区别

使用read接收文件,由于传过来的文件大小错误,结果导致程序卡死在read处,之后改用recv接收。 recv使用MSG_DONTWAIT,在发现多次接收长度小于等于0时,中断接收返回。 下面是摘...
  • superbfly
  • superbfly
  • 2017年05月27日 16:01
  • 730

linux下socket编程和epoll的使用

这两天在学Linux下的网络编程,于是便看了些关于socket和epoll的资料。 首先介绍socket,socket编程我之前也接触过,不过是在windows下接触的。和windows不同的...
  • h294229025
  • h294229025
  • 2017年02月19日 23:32
  • 238

windows环境下用c++实现socket编程

一、什么是Socket socket即套接字,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。 sockets(套接字)编程有三种,流式套接字(SOCK_S...
  • xiaoquantouer
  • xiaoquantouer
  • 2017年02月27日 16:29
  • 15458

Windows/Linux C语言的Socket编程例子(TCP和UDP)

最近看了一些网络编程的书籍,一直以来总感觉网络编程神秘莫测,其实网络编程入门还是很容易学的,下面这些代码是我在linux下编写的,已经运行过了,编译之后就可以运行了。有不足之处希望大家多多指出,共同学...
  • zgtjwyftc
  • zgtjwyftc
  • 2013年08月06日 14:03
  • 15223

小练习:用socket实现Linux和Windows之间的通信

结合了网上一些经典例程,写了一个简单的socket代码,实现Ubuntu(虚拟机中)和Windows的通信。...
  • liyuefeilong
  • liyuefeilong
  • 2015年08月04日 00:07
  • 3928

windows下socket编程,多线程

sercer端 #include #include #include #pragma comment(lib,"ws2_32.lib") void send(void *a); void sh...
  • wzq224
  • wzq224
  • 2013年12月26日 10:15
  • 1129

利用socket实现Windows与Linux平台间的网络通信

摘要: 介绍了socket的工作原理,构建出一个适用于Windows和Linux操作系统的、跨平台的网络通信程序,并给出设计原理和开发步骤。整个系统采用客户机/服务器(C/S)模型,在Windows系...
  • faihung
  • faihung
  • 2017年04月16日 23:03
  • 1223

Linux下的socket编程

Linux下的网络编程的含义 linux 网络编程是通过socket(套接字)接口实现,socket是一种文件描述符(可类比文件操作),socket起源于UNIX,在Unix一切皆文件哲学的思想下,...
  • phiall
  • phiall
  • 2016年06月28日 15:03
  • 1063

C++服务器(二):Windows下的socket编程

在上一篇博客中,我主要写了Linux下的sokcet编程,这篇文章,主要是想写一下Windows下的编程时怎样的。 为后期实现服务器的跨平台做好准备。以前刚好做过 TCP 、UDP socket 编...
  • u014613043
  • u014613043
  • 2016年03月17日 10:03
  • 2065
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows Socket和Linux Socket编程的区别
举报原因:
原因补充:

(最多只允许输入30个字)