linux socket linux应用层接口手册

大家好,今天小编来为大家解答以下的问题,关于linux socket,linux应用层接口手册这个很多人还不知道,现在让我们一起来看看吧!

Linux socket的基本操作socket、bind、listen、accept

Linux socket的基本操作涉及到 socket、bind、listen、accept等关键函数。在开始之前,应明确 socket函数的作用类似于普通文件的打开操作,返回一个用于后续读写操作的描述符。创建 socket时,可通过指定参数类型和协议创建不同类型的 socket,但需注意不同类型和协议的组合限制。默认情况下,创建的 socket是主动类型的,后续应通过 bind函数为其绑定特定的地址和端口。bind函数接收地址族、地址和端口作为参数,用于将地址信息赋给 socket。服务器通常在启动时使用 bind函数绑定一个众所周知的地址,以便客户端能连接。而客户端则无需指定地址,系统会自动为其分配端口。在进行 socket操作时,需将主机字节序转换为网络字节序,以确保数据传输的一致性。服务器在调用 listen函数后变为被动监听状态,等待客户端连接请求。客户端调用 connect函数尝试建立连接,服务器通过 accept函数接收请求并建立连接。之后,即可进行网络 I/O操作,类似于普通文件的读写。读写操作可使用 recvmsg()/sendmsg()函数,它们是最通用的 I/O函数,能替代其他 I/O函数。完成操作后,通过 close函数关闭 socket描述符。close操作仅标记 socket为关闭状态,实际关闭需等待引用计数降至零。

浅谈Linux下Socket选项设置

TCP/IP协议栈是Linux内核的基石,而Socket层作为TCP/IP层与应用层之间的桥梁,提供了诸如socket/bind/accept/connect等抽象接口,大大简化了网络编程。Socket选项为满足用户定制需求而生,涵盖了地址复用、端口复用、读写超时时间、缓冲区大小等。在Linux中,Socket选项分布在TCP层、IP层与Socket层等,设置时需指定level。通过图示可以直观了解Socket层及各层支持的选项。常用操作Socket选项的API包括getsockopt、setsockopt、fcntl和ioctl。函数调用时需遵循特定的参数格式,明确level、optname、optval类型与长度。optval与optlen作为参数,与操作的选项直接关联,其中optval使用void*类型,optlen使用socklen_t*类型。socklen_t类型与int长度一致,避免了size_t在64位结构中的长度不一致问题。在读写选项时,optval与optlen的编写需根据实际情况决定。SO_REUSEADDR选项用于解决重启时绑定失败的问题,允许同一地址和端口在TIME_WAIT状态时被复用。SO_REUSEPORT选项在Linux3.9版本引入,允许多个进程监听同一IP和端口,增加了对进程所属用户的限制,实现简单的负载均衡。TCP_NODELAY选项用于解决网络拥塞问题,允许发送小包且不强制等待,适用于时效性高的应用。这些选项的设置方法和使用场景,为网络编程提供了丰富的灵活性与优化手段。

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

[cpp] view plaincopy

#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

[cpp] view plaincopy

#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

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

阅读剩余
THE END