2013-09-24 3 views
0

Для одного из моих классов я должен запрограммировать сервер и клиент, и нам был предоставлен пример кода для работы. Вот фрагмент кода я запутался:Что такое Sockaddr_in в этой программе?

main() 
{ 
int  sock, sock_current, cc, fromlen, tolen; /*sd is the socket */ 
int  addrlen; 
struct sockaddr_in sin; 
struct sockaddr_in pin; 

/* get an internet domain socket */ 
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
    perror("socket"); 
    exit(1); 
} 

/* complete the socket structure */ 
memset(&sin, 0, sizeof(sin)); 
sin.sin_family = AF_INET; 
sin.sin_addr.s_addr = INADDR_ANY; 
sin.sin_port = htons(PORT); 

/* bind the socket to the port number */ 
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) == -1) { 
    perror("bind"); 
    exit(1); 
} 

Я думаю, что цель sockaddr_in STRUCT грех хранить локальный IP-адрес для связи с носком, когда он получает связан. Правильно ли я это понимаю? Если я прав, как это делает этот фрагмент кода? Я не понимаю:

/* complete the socket structure */ 
memset(&sin, 0, sizeof(sin)); 
sin.sin_family = AF_INET; 
sin.sin_addr.s_addr = INADDR_ANY; 
sin.sin_port = htons(PORT); 
+0

С каким битом вы боретесь? –

ответ

2

bind функция назначает локальный адрес протокола к розетке. Цель sin здесь - сообщить bind, какой локальный адрес назначить.

memset(&sin, 0, sizeof(sin));  
sin.sin_family = AF_INET;   //it's an IPv4 address 
sin.sin_addr.s_addr = INADDR_ANY; //wildcard IP address 
sin.sin_port = htons(PORT);  //bind to this port number 
0

В дополнение к тому, что сказал Ю. (что все правильно), если вы не вызываете привязки перед вызовом listen() (который, вероятно, сразу после сниппета вас в курсе), он будет слушать на случайном TCP порту (потому что вы открыли TCP-порт IPv4 при вызове socket()).

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

Кроме того, вы можете связать, прежде чем звонить connect(), если вы хотите, чтобы какой-либо порт или интерфейс выполнял исходящее соединение, но это также необычно.

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