windows linux java socket注意_Windows Socket和Linux Socket编程的区别

1、一些常用函数的移植

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

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函数首字母都是小写的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值