1)
头文件
windows
下
winsock.h
或
winsock2.h linux
下
netinet/in.h
(大部分都在这儿),
unistd.h
(
close
函数在这儿),
sys/socket.h
(在
in.h
里已经包含
了,可以省了)
2)
初始化
windows
下需要用
WSAStartup
启动
Ws2_32.lib
,并且要用
#pragma comment(lib,"Ws2_32")
来告知编译器链接该
lib
。
linux
下不需要
3)
关闭
socket windows
下
closesocket(...) linux
下
close(...) 4)
类型
windows
下
SOCKET linux
下
int
(我喜欢用
long
,这样保证是
4byte
,因为
-1
我总喜欢写成
0xFFFF
)
5)
获取错误码
windows
下
getlasterror()/WSAGetLastError() linux
下,未能成功执行的
socket
操作会返回
-1
;如果包含了
errno.h
,就会设置
errno
变量
6)
设置非阻塞
windows
下
ioctlsocket() linux
下
fcntl()
,需要头文件
fcntl.h 7)send
函数最后一个参数
windows
下一般设置为
0 linux
下最好设置为
MSG_NOSIGNAL
,如果不设置,在发送出错后有可能会导致程序退出
8)
毫秒级时间获取
windows
下
GetTickCount() linux
下
gettimeofday() 9)
多线程
windows
下包含
process.h
,使用
_beginthread
和
_endthread linux
下包含
pthread.h
,使用
pthread_create
和
pthread_exit 10)
用
IP
定义一个地址(
sockaddr_in
的结构的区别)
windows
下
addr_var.sin_addr.S_un.S_addr linux
下
addr_var.sin_addr.s_addr
而且
Winsock
里最后那个
32bit
的
S_addr
也有几个以联合(
Union
)的形式与它共享内存空间的成员变量(便于以其他方式赋值),而
Linux
的
Socket
没有这个联合,就是一个
32bit
的
s_addr
。遇到那种得到了是
4
个
char
的
IP
的形式(比如
127
一个,
0
一个,
0
一个
和
1
一个共四个
char
),
WinSock
可以直接用
4
个
S_b
来赋值到
S_addr
里,而在
Linux
下,可以用边向左移位(一下
8bit
,共四下)边
相加的方法赋值。
11)
异常处理
linux
下当连接断开,还发数据的时候,不仅
send()
的返回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出
BrokePipe
,程序会退出。为此,
send()
函数的最后一个参数可以设
MSG_NOSIGNAL
,禁止
send()
函数向系统发送异常消息。
socket在windows下和linux下的区别
1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2)初始化 windows下需要用WSAStartup WSADATA wsaData; err = WSAStartup(0x202,&wsaData); if ( err != 0 ) { return 0; } else if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) //检测是否支持这个版本的socket { WSACleanup( ); return 0; } 对应的退出清理用WSACleanup( ); linux下不需要 3)关闭socket windows下closesocket(...) linux下close(...) 4)socket类型 windows下SOCKET linux下int 5)获取错误码 windows下WSAGetLastError() linux下errno变量 extern int errno; int geterror(){return errno;} 6)设置非阻塞 windows下ioctlsocket(server_socket,FIONBIO,&ul); int ul = 1 linux下fcntl(server_socket,F_SETFL, O_NONBLOCK); <fcntl.h> 7)send函数最后一个参数 windows下一般设置为0 linux下必须是后几个参数用到的socket中,值最大的数(整型)加1(另一种说法是设置为MSG_NOSIGNAL) 8)毫秒级时间获取 windows下GetTickCount() linux下gettimeofday() 9)编译连接 windows下ws2_32.lib linux下 连接是使用参数:-lstdc 运行时需要libstdc++.so.5,可在/usr/lib目录中创建一个链接。 10)Socket操作错误返回值 都为SOCKET_ERROR,他的值是-1 11)异常处理 windows下没有对send()的异常处理,最后一个参数无效,写0就可以了。 linux下 当连接断开,还发数据的时候,不仅send()的返回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退 出。为此,send()函数的最后一个参数可以设置MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。 12)WSA宏 windows下WSA相关的操作 linux下WSA相关的操作在Linux不必要,直接去掉即可 13)多线程 多线程: (win)process.h --〉(linux)pthread.h _beginthread --> pthread_create _endthread --> pthread_exit |