c - 绑定(bind)失败 : Cannot assign requested address

标签 c linux sockets server command-line-arguments

第二次运行此服务器代码时,出现此错误

"Binding failed: Cannot assign requested address".

我正在使用 RE_USEADDR,但问题仍然存在。我了解服务器在使用后不会关闭。

命令行输入:

arg[1]=127.0.0.1,arg[2]=5019

代码

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>

void reverse(char*, int, int);

int main(int argc, char* argv[]){
int welcomeSocket, newSocket;
char buffer[1024];
struct sockaddr_in serverAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size;
int val=1;

bzero((char*)&serverAddr,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(atoi(argv[2]));
serverAddr.sin_addr.s_addr = htonl(argv[1]);
if((welcomeSocket = socket(AF_INET, SOCK_STREAM, 0))==-1){
        perror("socket err");
        exit(1);}


memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);

setsockopt(welcomeSocket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(int));

if(bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr))<0){
    perror("Binding failed\n");
    exit(1);}

if(listen(welcomeSocket,5)==0)
    printf("Listening\n");
else
    printf("Error\n");

while(1){
    printf("1");
    addr_size = sizeof(serverStorage);
    newSocket = accept(welcomeSocket, (struct sockaddr *) &serverStorage, &addr_size);

    recv(newSocket, buffer, 1024, 0);
    printf("Data received: %s",buffer);

    reverse(buffer, 0, strlen(buffer)-1);
    send(newSocket,buffer,13,0);

    close(newSocket);
}
close(welcomeSocket);
return 0;
}

无论其 IP 和端口如何,我都希望它每次都能正常工作。

最佳答案

htonl 函数需要一个 32 位整数值。您传递的是一个字符串的地址,所以您实际上是在尝试使用这个地址,将其转换为网络字节顺序的 32 位值,作为 IP 地址。

您反而想将字符串传递给 inet_addr,它将 IPv4 地址的字符串表示形式转换为网络字节顺序的 32 位值。

serverAddr.sin_addr.s_addr = inet_addr(argv[1]);

关于c - 绑定(bind)失败 : Cannot assign requested address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581082/

相关文章:

c - C 中十六进制字符串转换为整数

c - 数组的值在执行期间随机变化

linux - Linux 中的延迟内核 panic

linux - 使用 yum 实用程序通过 python 脚本下载 linux 包失败

linux - snmpwalk 因 authorizationError 失败

ios - 如何通过 TCP 将 IplImage 从服务器发送到 iPod 客户端 UIImage

c++ - 如何从 C++(跨平台)运行 mercurial 查询?

c - 如何在 C 中用字符串填充动态数组

Java套接字绑定(bind)两次无异常

.net - UdpClient.CancelReceive 在哪里?