2010-01-12 4 views
0

I이 비동기 소켓 프로그래밍에 대한 다음 코드를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

왜 특정 포트를 사용 하시겠습니까?

클라이언트 포트는 의도적으로 선택됩니다. 소켓에서 수신 대기하지 않는 포트는 한 번에 하나의 소켓 만 열 수 있기 때문에 의도적으로 선택됩니다.

예를 들어 HTTP 연결의 클라이언트 쪽에서 항상 포트 80을 사용하면 해당 컴퓨터의 소켓 하나만 포트 80에 한 번에 연결할 수 있습니다. 그것은 HTTP 연결이 병렬이 될 수 없다는 것을 의미합니다.

+0

나는 소켓/포트 기능의 방식을 알지 못했습니다. 이것은 좋은 교육이었습니다. 귀하의 의견에 감사드립니다. – iTEgg

0

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***********************/ 
관련 문제