LINUX.ORG.RU

Проблемы с серверным приложением


0

0

/*
В следующем коде функция recv всё время возвращает -1,
т.е. происходит ошибка, несмотря на то, что до этого всё
вроде бы произошло нормально, bind,accpet и все дела.
Такая чушь, а не могу понять из-за чего не работает !
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <string.h>
#include <netinet/tcp.h>

int main(int argc, char *argv[])
{
fprintf(stdout,"Initializing...\n");
int sock,len,test;
unsigned char buff[1024];
struct sockaddr_in host;
sock = socket(AF_INET,SOCK_STREAM,0);

host.sin_family = AF_INET;
host.sin_port = htons(31111);
host.sin_addr.s_addr = htonl(INADDR_ANY);

len = sizeof(host);
fprintf(stdout,"Binding...\n");
bind(sock,(struct sockaddr*)&host,sizeof(host));
test = listen(sock,1);
if(test==-1)
fprintf(stdout,"listen(...) returned -1 !\n");
test = accept(sock,(struct sockaddr*)&host,&len);
if(test==-1)
fprintf(stdout,"accept(...) returned -1 !\n");
else
fprintf(stdout,"Some clinet connected...\n");
fprintf(stdout,"waiting for recv...\n");

test = recv(sock,buff,strlen(buff)+1,0);
printf("%s\n",buff);
printf("recv returned %d\n",test);
close(sock);

return 0;
}


Re:

recv нужно делать не из sock, а из test.

Murr ★★
()

Вот основные ошибки.

1) accept возвращает сокет с принятым соединением, слушающий сокет продолжает слушать и читать их него нельзя.

2)Чтобы разобраться что за ошибка используй либо perror, либо strerror(). Почитай о них в мане.

Вот сам исправленный код:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <string.h>
#include <netinet/tcp.h>

int main(int argc, char *argv[])
{
int sock,test,acceptedSock;
unsigned char buff[1024];
struct sockaddr_in host;
socklen_t len;

fprintf(stdout,"Initializing...\n");
sock = socket(AF_INET,SOCK_STREAM,0);
host.sin_family = AF_INET;
host.sin_port = htons(31111);
host.sin_addr.s_addr = htonl(INADDR_ANY);
len = sizeof(host);

printf("Binding...\n");
bind(sock,(struct sockaddr*)&host,sizeof(host));

test = listen(sock,1);

if(test==-1)
perror("listen");

acceptedSock = accept(sock,(struct sockaddr*)&host,&len);

if(acceptedSock==-1)
perror("accept");
else

printf("Some clinet connected...\n");
printf("waiting for recv...\n");

/*
Во еще ошибочка. Recv возвращает количество прочитанных байт.
То что ты передал ему длину мусора (strlen(buff)) - чушь.
Во - первых, буфер содержал мусор, во втоых надо использовать sizeof.
Далее надо поставить нуль байт в конце принятой строки.

Еще есть вариант переоткрыть сокет (fdopen) и работать обычными ф-циями с ним,
типа fprintf.
*/
test = recv(acceptedSock,buff,sizeof(buff)-1,0);

buff[test]=0;

printf("%s\n",buff);

perror("recv\n");

return 0;

}

OxiD ★★★★
()

Млин я не знаю как я такое мог накодить ! Ужас, стыдно даже. Ух давно я сокеты не программил. Спасибо всем за исправленные ошибки.

xor01b
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.