套接字编程 C++ setsockopt()

Posted

技术标签:

【中文标题】套接字编程 C++ setsockopt()【英文标题】:Socket Programming C++ setsockopt() 【发布时间】:2018-01-15 12:36:37 【问题描述】:

我是套接字编程的新手。我正在尝试编写一个基本的套接字编程程序。我查看了 socket()、bind()、setsockopt() 函数和其他函数的用法以及工作代码示例。在 setsockopt() 函数中,我使用了 SO_REUSEPORT 选项,但是当我第一次在给定端口地址上运行程序时它工作正常,但是对于任何后续运行,绑定都会失败,除非我更改为其他端口地址

我的代码示例:-

#include<iostream>
#include<cstdio>
#include<sys/socket.h>
#include<sys/types.h>
#include <netinet/in.h>
#include<unistd.h>
#include<cstdlib>
#include<cstring>
using namespace std;

int main()

    int opt=1;
    socklen_t optlen=sizeof(opt);
    char buffer[1024] = 0;
    int sock=socket(AF_UNIX,SOCK_STREAM,0);
    if(sock==-1)
    
    cout<<"Socket Creation not successful"<<endl;
    exit(1);
    
    cout<<"Socket Created"<<endl;
    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR|SO_REUSEPORT,&opt,optlen);
    struct sockaddr_in address;
    address.sin_family = AF_UNIX;
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    address.sin_port = htons(9091);

    int addrlen = sizeof(address);
    int x=bind(sock,(struct sockaddr *)&address,
                            sizeof(address));
    if(x==-1)
    
            cout<<"Binding Unsuccessful"<<endl;
            exit(1);
    
    cout<<"Binding successful"<<endl;

/*

     if(x<0)
//      
//      perror("Bind failed");
//      exit(EXIT_FAILURE);
//      
    int y=listen(sock,5);
    int neww= accept(sock,(struct sockaddr *)&address, 
                   (socklen_t*)&addrlen);
    //int val=read(neww 
 cout<<sock<<endl;
 cout<<x<<endl;
cout<<y<<endl;
cout<<neww<<endl;

cout<<"Haha";
int valread = read (neww , buffer, 1024);
puts(buffer);
send(neww,buffer,strlen(buffer),0);

*/

int c=close(sock);
cout<<c<<endl;

附:我是个初学者,对上面用到的大部分参数都不是很了解

【问题讨论】:

您不能对它们进行 OR,只需使用 SO_REUSEADDR 问题询问 setstackopt() 但提供的代码调用 setsockopt() 没有setstackopt()这样的东西:请更正您的帖子。 AF_UNIX 和 sockaddr_in 和 INADDR_ANY 不能一起使用。 sockaddr_in 仅适用于 AF_INET,您不能将其与 AF_UNIX 一起使用。您必须改用sockaddr_un 请修正你的标题以及你的帖子。 【参考方案1】:

我认为这就是你想要做的:

  const int opt = 1;
  setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));

【讨论】:

我试过了。当我们使用端口号两次时,它仍然无法绑定。

以上是关于套接字编程 C++ setsockopt()的主要内容,如果未能解决你的问题,请参考以下文章

套接字选项

使用setsockopt()将dscp值设置为套接字

setsockopt()函数

Python网络编程—套接字属性

setsockopt()和getsockopt()函数参数

Linux socket编程 套接字选项