gpt4 book ai didi

linux - 套接字 : bind address not supported by protocol

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:43 25 4
gpt4 key购买 nike

一个简单的 TCP 回显服务器的源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAX_BUFFER 1024
#define PORT 20000

int main()
{
int lsock,csock, ret, in , i;
int yes = 1;
char buffer[MAX_BUFFER];
char* c;
struct addrinfo hints, *servinfo, *p;
struct sockaddr_in servaddr;
struct sockaddr_in cliaddr; // connector's address information

if((lsock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))<0){
perror("socket");
exit(0);
}

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(lsock,(struct sockaddr*)&servaddr,sizeof(servaddr))<0) {
close(lsock);
perror("server: bind");
return -1;
}

if(listen(lsock,5)<0){
perror("listen");
exit(0);
}else{
printf("Server listening on port %i\n",PORT);
}

while(1){
int len = sizeof(cliaddr);
bzero(&cliaddr,len);

if(csock = accept(lsock,(struct sockaddr*)&cliaddr,&len)<0){
perror("accept");
exit(0);
}

printf("New client connected....\n");

in = recv(csock,(void*)&buffer,sizeof(buffer),0);

if(in <0){
perror("recvmsg");
close(csock);
exit(0);
}else if(in==0){
printf("client disconnected\n");
close(csock);
}else{

if(send(csock,(void*)buffer,sizeof(buffer),0)<0){
perror("sendmsg");
close(csock);
}
}
}

return 0;
}

代码编译得很好。但是每当我执行输出文件时,我都会收到以下错误消息:

server: bind: Address family not supported by protocol

我使用 netcat 命令测试网络接口(interface),包括监听和连接到环回接口(interface),因此这似乎不是内核问题。但是无论我尝试绑定(bind)到哪个地址,它都会返回相同的错误消息。我什至说 GCC 的错误报告在大约 7 年前提到了这个特定错误,所以我显然不是第一个遇到这个问题的人(这是 GCC 的以前版本)。我有 GCC 4.7.3 版。有没有人有更新了 glibc 库的 4.8.X 版本?如果是这样,我想知道这个错误是否仍然存在。

最佳答案

所以我通过向它添加 header 来修改 header (它具有套接字函数的实际系统调用编号)。并将之前用原型(prototype)(链接到 Glibc 库)实现的“绑定(bind)”函数替换为:

extern int bind(int sockfd,  __SOCKADDR_ARG addr, socklen_t addrlen)__THROW;

使用 __NR_syscall 表中的绑定(bind)值进行直接系统调用的实际实现:

int bind(int sockfd,  __SOCKADDR_ARG addr, socklen_t addrlen)
{

_syscall3(int,bind,int,sockfd,__SOCKADDR_ARG,addr,socklen_t,addrlen)


} __THROW;

编译执行输出文件后的输出。

Server listening on port 20000

w00t!w00t!

关于linux - 套接字 : bind address not supported by protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21412046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com