c语言socket 释放,C语言socket编程

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

[code language=”cpp”]struct sockaddr { unsigned short sa_family; char sa_data[14]; };[/code] 这是一个16字节大小的结构(2+14),sa_family可以认为是socket address family的缩写,也可能被简写成AF(Address Family),AF种类有许多,我们使用internet家族AF_INET 另外的14字节是用来描述地址的 当我们指定sa_family=AF_INET之后,sa_data的形式也就被固定了下来:最前端的2字节用于记录16位的端口,紧接着的4字节用于记录32位的IP地址,最后的8字节清空为零。 这就是我们实际在构造sockaddr时候用到的结构sockaddr_in(意指socket address internet): [code language=”cpp”]struct sockaddr_in { unsigned short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; };[/code] sin_addr被定义成了一个结构,这个结构实际上就是:

[code language=”cpp” highlight=”3”]struct in_addr { unsigned long s_addr; };[/code]

socket()

创建一个套接口()。

[code language=”cpp”]#include int socket( int af, int type, int protocol);[/code]

af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。

type:指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM)和UDP(SOCK_DGRAM)。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。

protocol:顾名思义,就是指定协议。套接口所用的协议。如调用者不想指定,可用0。常用的协议有,IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C 语言 IPv6 Socket 客户端示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <sys/socket.h> #include <arpa/inet.h> #define PORT "8080" // 连接的端口号 int main(int argc, char *argv[]) { int sockfd; struct addrinfo hints, *servinfo, *p; int rv; char s[INET6_ADDRSTRLEN]; char message[100]; // 发送的消息 // 如果没有指定服务器的 IP 地址 if (argc != 2) { fprintf(stderr,"usage: client hostname\n"); exit(1); } memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // 遍历所有结果,直到成功连接为止 for (p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("client: socket"); continue; } if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(sockfd); perror("client: connect"); continue; } break; } if (p == NULL) { fprintf(stderr, "client: failed to connect\n"); return 2; } inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof s); printf("client: connecting to %s\n", s); freeaddrinfo(servinfo); // 全部都用这个结构体 // 发送消息 printf("Enter a message to send: "); fgets(message, 100, stdin); send(sockfd, message, strlen(message), 0); close(sockfd); return 0; } ``` 需要注意的是,IPv6 地址的长度比 IPv4 地址长,因此需要使用 `INET6_ADDRSTRLEN` 宏定义来给 `inet_ntop` 分配足够的空间。 此外,`getaddrinfo` 函数可以自动的获取本地主机支持的协议族和地址类型,并返回一个 `addrinfo` 结构体链表,如果返回值不为 0,则说明该函数调用失败。函数返回的 `addrinfo` 结构体中包含了目标地址的信息,例如 IP 地址、协议族、端口号等。在 `connect` 函数中,我们向目标地址发起了连接请求,如果连接成功,则返回一个新的套接字描述符,否则会返回 -1。最后,在发送完消息后,一定要关闭套接字,以释放资源。 希望这份代码能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值