تابع ()setsockopt

این تابع برای ایجاد تغییرات در option های یک سوکت استفاده می شود.

// man 2 setsockopt
#include <sys/types.h>
#include <sys/socket.h>
 
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

گاهی هنگام اجرای مجدد یک سرور با خطای «Address already in use» مواجه می شویم.

برای جلو گیری از این خطا باید بعد از گرفتن ()socket و قبل از فراخوانی ()bind ، تابع ()setsockopt به شکل زیر فراخوانی شود:

// man 7 socket
int option=1;
 
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&option, sizeof option) == -1) {
  perror("setsockopt");
  exit(1);
}

برای پشتیبانی از dual-stack می توان یک سوکت IPv6 با hints زیر از تابع ()socket گرفت :

    hints.ai_flags = AI_PASSIVE;
    hints.ai_family = AF_INET6;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

و سپس با اجرای تابع ()setsockopt به شکل زیر از همان یک سوکت برای اتصال همزمان به IPv4 و IPv6 استفاده کرد:

// man 7 ipv6
int option=0;
 
if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&option, sizeof option) == -1) {
  perror("setsockopt");
  exit(1);
}