【问题标题】:C# Specify Client PortC# 指定客户端端口
【发布时间】:2011-01-04 07:20:30
【问题描述】:

我有以下关于异步套接字编程的代码:

    public void ServerBeginAceept(ushort ServerPort)
    {
        try
        {
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, ServerPort);
            ServerSocket.Bind(ipEndPoint);
            ServerSocket.Listen(MAX_CONNECTIONS);
            IAsyncResult result = ServerSocket.BeginAccept(new AsyncCallback(ServerEndAccept), ServerSocket);
        }
    }


    public void ServerEndAccept(IAsyncResult iar)
    {
        try
        {
            ServerSocket = (Socket)iar.AsyncState;
            CommSocket = ServerSocket.EndAccept(iar);
        }
    }

    public void ClientBeginConnect(string ServerIP, ushort ServerPort)
    {
        try
        {
            CommSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(ServerIP), ServerPort);
            IAsyncResult result = CommSocket.BeginConnect(ipEndPoint, new AsyncCallback(ClientEndConnect), CommSocket);

        }
    }


    public void ClientEndConnect(IAsyncResult iar)
    {
        try
        {
            CommSocket = (Socket)iar.AsyncState;
            CommSocket.EndConnect(iar);

            OnNetworkEvents eventArgs = new OnNetworkEvents(true, "Connected: " + CommSocket.RemoteEndPoint.ToString(), string.Empty);
            OnUpdateNetworkStatusMessage(this, eventArgs);
        }
    }

代码没有任何问题(我已对其进行了简化,并在此处展示它以证明我正在处理它而不是寻求家庭作业帮助!)

我的问题是:如何从指定的客户端端口与服务器通信?这里的代码都是基于服务器的端口,这很好用。但我想实现与客户端上的特定端口通信的代码,而不仅仅是服务器随机生成的一个。

感谢您的宝贵时间。

【问题讨论】:

    标签: c# sockets client port


    【解决方案1】:

    为什么要使用特定端口?

    客户端端口在设计上是随机选择的,因为只有一个套接字可以在没有监听该套接字时同时打开一个端口。

    例如,如果您始终在 HTTP 连接的客户端使用端口 80,则该机器上的一个套接字一次只能连接到端口 80。这意味着 HTTP 连接不能并行。

    【讨论】:

    • 我不知道套接字/端口的工作方式。这是很好的教育。感谢您的意见。
    【解决方案2】:

    不确定 C#,但这是一个可行的解决方案。在 C 中:

         /*dl_senderprog.c - debian linux send to server a client, datagram*/
    
     /***********************************************************************
    
    
     140203  lets see if we can bind to a port
    
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket#
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket# vi senderprog_bind.c
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket# gcc -g senderprog_bind.c -o senderprog_bind
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket# ./senderprog_bind
     Sender:Client-Usage: ./senderprog_bind <hostname> <message>
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket#
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket#
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket# ./senderprog_bind 10.0.1.26 "dot,33,22"
     MY IP address:10.0.1.242: on port: 1043
     Sender: Client-gethostname() is OK...
     Sender: Client-socket() sockfd is OK...
     Sender: Using port: 14950
     Sender: Client-sendto() is OK...
     Sender: sent 9 bytes to 10.0.1.26
     Sender: Client-sockfd successfully closed!
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket#
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket#
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket# # it worked!!!!!
     ts7500:/var/www/jon/uvir_sensor_lab/source/socket#
    
    
    
     ***********************************************************************/
    
    
    
    
     #include <stdio.h>
     #include <stdlib.h>
     #include <unistd.h>
     #include <errno.h>
     #include <string.h>
     #include <sys/types.h>
     #include <sys/socket.h>
     #include <netinet/in.h>
     #include <arpa/inet.h>
     #include <netdb.h>
    
     #include <sys/ioctl.h>
     #include <net/if.h>
    
    
    
    
    
     /* the port users will be connecting to 14950 is the port on the windows machine
        that I have the server running on */
     #define TOPORT 14950
     #define MYPORT 1043
    
     void my_ip( char *myniccard, char *myipaddr) {
          int fd;
          struct ifreq ifr;
    
          myipaddr[0]=0;
    
          fd = socket(AF_INET, SOCK_DGRAM, 0);
    
          /* I want to get an IPv4 IP address */
          ifr.ifr_addr.sa_family = AF_INET;
    
          /* I want IP address attached to "eth0" */
          //strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
          strncpy(ifr.ifr_name, myniccard, IFNAMSIZ-1);
    
          ioctl(fd, SIOCGIFADDR, &ifr);
    
          close(fd);
    
          /* display result */
          sprintf(myipaddr,"%s"
            , inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
          printf("MY IP address:%s: on port: %d\n", myipaddr, MYPORT);
    
          }   // my_ip
    
    
     int main(int argc, char *argv[ ])
     {
     int sockfd;
     /* connectors address information */
     struct sockaddr_in their_addr;
     struct sockaddr_in localaddr;
     char myipaddressm[22];   //buffer for ip address
     char *myniccardm ="eth0";   // check with ipconfig for correct ethernet port
    
     struct hostent *he;
     int numbytes;
    
     if (argc != 3) {
          fprintf(stderr, "Sender:Client-Usage: %s <hostname> <message>\n", argv[0]);
          exit(1);
          }
    
     my_ip(myniccardm, myipaddressm);
    
    
     /* get the host info */
     if ((he = gethostbyname(argv[1])) == NULL) {
          perror("Sender: Client-gethostbyname() error lol!");
          exit(1);
          }
      else
          printf("Sender: Client-gethostname() is OK...\n");
    
     if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
           perror("Sender: Client-socket() error lol!");
           exit(1);
           }
       else
           printf("Sender: Client-socket() sockfd is OK...\n");
    
    
     // Bind to a specific network interface
     // (this is unusual, as you normally do not want a specific
     //  port for the client, but we have a specific server in
     //  this case that will not accept connects unless its on
     //  a specific port )
     localaddr.sin_family = AF_INET;
     localaddr.sin_addr.s_addr = inet_addr(myipaddressm);
     localaddr.sin_port = htons(MYPORT);  // Any local port will do
     bind(sockfd, (struct sockaddr *)&localaddr, sizeof(localaddr));
    
    
    
     /* host byte order */
     their_addr.sin_family = AF_INET;
     /* short, network byte order */
     printf("Sender: Using port: %d\n",TOPORT);
     their_addr.sin_port = htons(TOPORT);
     their_addr.sin_addr = *((struct in_addr *)he->h_addr);
     /* zero the rest of the struct */
     memset(&(their_addr.sin_zero), '\0', 8);
    
     if((numbytes = sendto(sockfd, argv[2],
                           strlen(argv[2]),
                           0,
                           (struct sockaddr *)&their_addr,
                           sizeof(struct sockaddr))) == -1) {
           perror("Sender: Client-sendto() error lol!");
           exit(1);
           }
       else
           printf("Sender: Client-sendto() is OK...\n");
    
     printf("Sender: sent %d bytes to %s\n", numbytes, inet_ntoa(their_addr.sin_addr));
    
     if (close(sockfd) != 0)
           printf("Sender: Client-sockfd closing is failed!\n");
       else
           printf("Sender: Client-sockfd successfully closed!\n");
     return 0;
    
     }//main
    
    
     /*******************************************EOF***********************/
    

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2013-03-16
      • 1970-01-01
      • 2021-11-15
      • 2018-10-14
      相关资源
      最近更新 更多