简体   繁体   English

如何在 C/C++ 中的套接字编程中绑定地址?

[英]How to bind address in socket programming in c/c++?

I want to bind address "95.96.10.1" with port number 8080. But when i tried below code it gave me error "address already in use".我想将地址“95.96.10.1”与端口号 8080 绑定。但是当我尝试下面的代码时,它给了我错误“地址已在使用中”。

#include <unistd.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <string.h> 
#define PORT 8080 
int main(int argc, char const *argv[]) 
{ 
int server_fd, new_socket, valread; 
struct sockaddr_in address; 
int opt = 1; 
int addrlen = sizeof(address); 
char buffer[1024] = {0}; 
char *hello = "Hello from server"; 

// Creating socket file descriptor 
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) 
{ 
    perror("socket failed"); 
    exit(EXIT_FAILURE); 
} 


if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, 
                                              &opt, sizeof(opt))) 
{ 
    perror("setsockopt"); 
    exit(EXIT_FAILURE); 
} 
address.sin_family = AF_INET; 
address.sin_addr.s_addr = INADDR_ANY; 
address.sin_port = htons( PORT ); 

// Forcefully attaching socket to the port 8080 
if (bind(server_fd, (struct sockaddr *)&address,  
                             sizeof(address))<0) 
{ 
    perror("bind failed"); 
    exit(EXIT_FAILURE); 
} 

Please let me know how to bind address with port?请告诉我如何将地址与端口绑定?

Currently, you're binding to INADDR_ANY which means to bind to all interfaces:目前,您正在绑定到INADDR_ANY ,这意味着绑定到所有接口:

address.sin_addr.s_addr = INADDR_ANY; 

If you want to bind to a specific address, you need to set it.如果要绑定到特定地址,则需要进行设置。 You can use the inet_addr function to convert an IPv4 string to an address value:您可以使用 inet_addr inet_addr将 IPv4 字符串转换为地址值:

address.sin_addr.s_addr = inet_addr("95.96.10.1"); 

Also, socket options can't be OR'ed together.此外,套接字选项不能一起 OR'ed。 You can only operate on one at a time.您一次只能操作一个。

if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) 
{ 
    perror("setsockopt"); 
    exit(EXIT_FAILURE); 
} 
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt))) 
{ 
    perror("setsockopt"); 
    exit(EXIT_FAILURE); 
} 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM