Linux Socket

参考自:https://blog.csdn.net/kunkliu/article/details/80848138

socket()函数介绍

int socket(int family, int type, int protocol);

socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。对于IPv4,family参数指定为AF_INET。对于TCP协议,type参数指定为SOCK_STREAM,表示面向流的传输协议。如果是UDP协议,则type参数指定SOCK_DGRAM,表示面向数据报的传输协议。protocol参数的介绍从略,指定为0即可。

bind()函数介绍

#include <sys/socket.h>

int bind(int socket, const struct sockaddr *address, socklen_t address_len);

将address指向的sockaddr结构体中描述的一些属性(IP地址、端口号、地址簇)与socket套接字绑定,也叫给套接字命名。

调用bind()后,就为socket套接字关联了一个相应的地址与端口号,即发送到地址值该端口的数据可通过socket读取和使用。当然也可通过该socket发送数据到指定目的。

对于Server,bind()一般在实际工程中是需要的,服务器启动时需要绑定指定的端口来提供服务(以便于客户向指定的端口发送请求),对于服务器socket绑定地址,一般而言将IP地址赋值为INADDR_ANY(该宏值为0),即无论发送到系统中的哪个IP地址(当服务器有多张网卡时会有多个IP地址)的请求都采用该socket来处理,而无需指定固定IP。

对于Client,一般而言无需主动调用bind(),一切由操作系统来完成。在发送数据前,操作系统会为套接字随机分配一个可用的端口,同时将该套接字和本地地址信息绑定。

注意:

客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号。

服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。

connect函数介绍

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);

客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。connect()成功返回0,出错返回-1。

.

/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/13451301.html