socket 服務器 一個端口多個ip 創建


tcp 應用服務器有時候會有多個網卡多個不同網段服務器ip地址,我們需要建一個socket server端綁定一個端口來接受多個網段相同端口的socket客戶端連接

此時就需要tcp應用服務器滿足此功能,以下方法創建socket服務器可滿足該需求

舉個例子,假設一個主機有inter1,inter2,,inter3三個接口,如果一個socket綁定了INADDR_ANY的地址和8000的端口,那么,從客戶端過來的一個TCP包到達該主機,不管客戶端connect的是inter1,inter2,inter3中的哪個地址,都會被該socket接收到。如果此時主機還要再建立一個新的socket,使用inter1接口和端口8000,將會失敗,因為這個端口和地址已經被第一個socket監聽了。

 

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")


int main()
{
  int sockfd, newsockfd, portno = 6666, clilen;
  char buffer[256];
  struct sockaddr_in serv_addr, cli_addr;
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0) {
    printf("ERROR opening socket\n");
    return 0;
  }
  ZeroMemory((char *)&serv_addr, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//不再綁定ip地址,此處設置后socket serverip為 0.0.0.0
  serv_addr.sin_port = htons(portno);
  if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
    printf("ERROR on binding\n");
    return 0;
  }

  listen(sockfd, 5);
  clilen = sizeof(cli_addr);
  newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
  if (newsockfd < 0) {
    printf("ERROR on accept\n");
    return 0;
  }

  ZeroMemory(buffer, 256);
  if (SOCKET_ERROR == recv(newsockfd, buffer, 255, 0)) {
    printf("ERROR reading from socket");
    return 0;
  }
  printf("Here is the message: %s\n", buffer);

  if (SOCKET_ERROR == send(newsockfd, buffer, 255, 0)) {
    printf("ERROR writing to socket");
    return 0;
  }

  return 0;
}

 

  1.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM