Приветствую всех!
Вроде все делал по доке, но клиент с сервером не соединяется. Пишу на С под FreeBSD.
Вот программа-сервер:
main (int argc, char *argv[]) {
int servAddrLen;
char host_addr[16];
char msg[100], comm[100], buff[8192];
struct sockaddr_in serv_addr;bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_LOOPBACK;
serv_addr.sin_port = htons (tcp_port);if((sockfd=socket(AF_INET, SOCK_STREAM, 0))<0)
print_error();
else {
#ifdef DEBUG
fprintf(stderr, "Сокет создан\n");
#endif
}servAddrLen=sizeof(serv_addr);
bind (sockfd, (struct sockaddr *) &serv_addr, sizeof(servAddrLen));
if (listen (sockfd, 10)<0) {
fprintf(stderr, "Error listen\n");
exit(-1);
}
while ((accSock=accept(sockfd, (struct sockaddr *) &serv_addr, &(servAddrLen)))) {
if (accSock > 0) write (accSock, "Call received", 20);
}
}А вот клиент:
main (int argc, char *argv[]) {
char host_addr[16];
char msg[100], comm[100], buff[8192], data;
struct sockaddr_in serv_addr;
int i;sprintf(host_addr, "127.0.0.1");
bzero(&serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr (host_addr);
serv_addr.sin_port = htons (tcp_port);if((sockfd=socket(AF_INET, SOCK_STREAM, 0))<0)
print_error();
else {
#ifdef DEBUG
fprintf(stderr, "Сокет создан\n");
#endif
}if(connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
print_error();
close(sockfd);
}
else {
#ifdef DEBUG
fprintf(stderr, "Связь с сервером создана\n");
#endif
}
while (1) {
if ((i=recv(sockfd, &buff, 20, 0))<0) {
fprintf(stderr, "Error recv\n");
exit(0);
}
buff[i]='\0';
printf ("Получено: %s\n", buff);
}
}
Буду благодарен тому кто подскажет в чем проблема.
>> serv_addr.sin_family
> = AF_INET;
> serv_addr.sin_addr.s_addr =
>INADDR_LOOPBACK;
> serv_addr.sin_port
> = htons (tcp_port);
>че за tcp_port ???
>>> serv_addr.sin_family
>> = AF_INET;
>> serv_addr.sin_addr.s_addr =
>>INADDR_LOOPBACK;
>> serv_addr.sin_port
>> = htons (tcp_port);
>>
>
>че за tcp_port ???Да, забыл - там в обоих программах перед main () - #define tcp_port 1700
>>>> serv_addr.sin_family
>>> = AF_INET;
>>> serv_addr.sin_addr.s_addr =
>>>INADDR_LOOPBACK;
>>> serv_addr.sin_port
>>> = htons (tcp_port);
>>>
>>
>>че за tcp_port ???
>
>Да, забыл - там в обоих программах перед main () - #define
>tcp_port 1700И еще вопрос - тип сокета (блокирующий или неблокирующий) у клиента и сервера должен совпадать?
Мож ipfw мешает :))))
и такое бывало....
>>>>> serv_addr.sin_family
>>>> = AF_INET;
>>>> serv_addr.sin_addr.s_addr =
>>>>INADDR_LOOPBACK;
>>>> serv_addr.sin_port
>>>> = htons (tcp_port);
>>>>
>>>
>>>че за tcp_port ???
>>
>>Да, забыл - там в обоих программах перед main () - #define
>>tcp_port 1700
>
>И еще вопрос - тип сокета (блокирующий или неблокирующий) у клиента и
>сервера должен совпадать?нет, не должен
воопщем откомпилировалю клиент соединяется через 1 минуту после запуска :) никогда такого не видел... а так sockstat выдает что сервер слушает совсем не на том порте что указаню и телнет на этот порт выдает вполне ожидаемый результат (в нашем случае Call received) .. вообщем ни хрена не понятна.... говорила мама на адвоката иди учись... эээх...
>воопщем откомпилировалю клиент соединяется через 1 минуту после запуска :) никогда такого
>не видел... а так sockstat выдает что сервер слушает совсем не
>на том порте что указаню и телнет на этот порт выдает
>вполне ожидаемый результат (в нашем случае Call received) .. вообщем ни
>хрена не понятна.... говорила мама на адвоката иди учись... эээх...А прикол-то в том, что ошибка в bind - должно быть
bind (sockfd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr));Большое спасибо, black_pokemon, не знал про sockstat - полезная штука