2010-01-12 4 views
0

У меня есть следующий код относительно асинхронных сокетов программирования:C# Укажите порт клиента

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); 
     } 
    } 

Ну нет ничего плохого в коде (я упростил его, и он представлен здесь как доказательство того, что я работаю на это не поиск домашней работы!)

Мой вопрос: как мне связаться с сервером с указанного клиентского порта? Код здесь - все серверный порт, и это хорошо работает. Но я хотел бы реализовать код, который говорит о конкретном порту на клиенте, а не только о том, что генерируется случайным образом сервером.

Спасибо за ваше время.

ответ

5

Почему вы хотите использовать определенный порт?

Порт клиента выбирается случайным образом по дизайну, поскольку только один сокет может открывать порт одновременно, когда он не прослушивает этот сокет.

Например, если вы всегда использовали порт 80 на клиентском конце HTTP-соединения, только один сокет с этой машины мог подключаться к порту 80 за раз. Это означает, что HTTP-соединения не могут быть параллельными.

+0

Я не знал, как функционируют разъемы/порты. это было хорошее образование. спасибо за ваш вклад. – iTEgg

0

не уверен о C#, но вот рабочее решение. in 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***********************/ 

 Смежные вопросы

  • Нет связанных вопросов^_^