欢迎来到【商城静态源码】【golang 源码包】【mib browser源码】winsocket源码-皮皮网网站!!!

皮皮网

【商城静态源码】【golang 源码包】【mib browser源码】winsocket源码-皮皮网 扫描左侧二维码访问本站手机端

【商城静态源码】【golang 源码包】【mib browser源码】winsocket源码

2024-11-19 08:41:01 来源:{typename type="name"/} 分类:{typename type="name"/}

1.Windows Socket和Linux Socket编程的区别

winsocket源码

Windows Socket和Linux Socket编程的区别

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

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

       1、一些常用函数的移植

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

       destAddr.sin_addr.s_addr=inet_addr("..1.1");

       Windows下:

       SOCKADDR_IN destAddr;

       destAddr.sin_addr.S_un.S_addr=inet_addr("..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[];

       };

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

       [cpp] view plaincopy

       #ifdef WIN

       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

       [cpp] view plaincopy

       #ifdef WIN

       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

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

       )数据类型的一些转化

       é€šç”¨çš„:

       å°ç«¯åˆ°å¤§ç«¯ï¼ˆç½‘络协议使用)的转换: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