2015-04-25 2 views
1

У меня возникли проблемы с получением моего TCP/IP-соединения между моим клиентом и сервером.TCP/IP в C не работает

Вот код сервера -

int main() { 
    int servSock; /* Socket descriptor for server */ 
    int clntSock; /* Socket descriptor for client */ 
    unsigned short echoServPort; /* Server port */ 
    struct sockaddr_in echoServAddr; /* Local address */ 
    struct sockaddr_in echoClntAddr; /* Local address */ 
    pid_t processID; /* Process ID from fork()*/ 
    unsigned int childProcCount = 0; /* Number of child processes */ 
    unsigned int clntLen; 
    unsigned int recvMsgSize; 

     echoServPort = 22; 
     if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ 
      printf("Socket failed"); 
     } 

     echoServAddr.sin_family = AF_INET; //Internet address family 
     echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); //Any incoming interface 
     echoServAddr.sin_port = htons(echoServPort); // Local port 

     if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0){ 
      printf("bind failed"); 
     } 

     if (listen(servSock, MAXPENDING) < 0){ 
      printf("listen() failed"); 
     } 

     clntLen = sizeof(echoClntAddr); 

     if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen))<0){ 
      printf("accept() failed"); 
     } 

     if ((recvMsgSize = recv(clntSock, buf, 1024, 0)) < 0){ 
      printf("recv() failed"); 
     } 

     /* Send received string and receive again until end of transmission */ 
     while (recvMsgSize > 0) { /* zero indicates end of transmission */ 


      printf("%d", recvMsgSize); 

     if (send(clntSock, buf, recvMsgSize, 0) != recvMsgSize){ 
      //printf(“send() failed”); 
     } 

     if ((recvMsgSize = recv(clntSock, buf, 1024, 0)) < 0){ 
      //printf(“recv() failed”); 
     } 

     } 

     sleep(60); 

    } 
} 
return EXIT_SUCCESS; 
} 

И клиентский код, который является приложением CGI.

int main(void) { 

int servSock; /* Socket descriptor for server */ 
int clntSock; /* Socket descriptor for client */ 
unsigned short echoServPort; /* Server port */ 
struct sockaddr_in echoServAddr; /* Local address */ 
struct sockaddr_in echoClntAddr; /* Local address */ 

struct sockaddr_in { 
     __uint8_t  sin_len; 
     sa_family_t  sin_family; 
     in_port_t  sin_port; 
     struct in_addr sin_addr; 
     char   sin_zero[8]; 
}; 
/*pid_t processID; Process ID from fork() 
unsigned int childProcCount = 0; Number of child processes 
unsigned int clntLen;*/ 
//char echoservIP = "10.0.0.2"; 
printf("Content-type: text/html\n\n"); 
puts("<HTML>"); 
puts("<BODY>"); 
echoServPort = 22; 
servSock = 22; 
clntSock = 22; 

puts("<br>"); 

if ((clntSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ 
    printf("socket() failed"); 
} 

echoServAddr.sin_family = AF_INET; //Internet address family 
echoServAddr.sin_addr.s_addr = inet_addr("10.0.0.2"); //Server IP address 
echoServAddr.sin_port = htons(echoServPort); //Server port 

echoClntAddr.sin_addr.s_addr = inet_addr("10.0.0.1"); 


if (connect(clntSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0){ 
    printf("connect() failed\n"); 

} 

int clntLen; 

clntLen = sizeof(echoClntAddr); 

if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen))<0){ 
    printf("accept() failed\n"); 
} 

char echoString[4] = "helo"; 

int echoStringLen; 

echoStringLen = strlen(echoString); //Determine input length 
//Send the string to the server 
if (send(clntSock, echoString, echoStringLen, 0) != echoStringLen){ 
    printf("send() sent a different number of bytes than expected"); 
} 

puts("<p>Hello <b>CGI</b</p>"); 
puts("</BODY>"); 
puts("</HTML>"); 


return EXIT_SUCCESS; 
} 

При отладке, проблема возникает на стороне клиента на линии

if ((clntSock=accept(servSock,(struct sockaddr 
    *)&echoClntAddr,&clntLen))<0){ 
    printf("accept() failed\n"); 
} 

И

if(send(clntSock, echoString, echoStringLen, 0) != echoStringLen){ 
    printf("send() sent a different number of bytes than expected"); 
} 

я получить выход

<HTML> 
<BODY> 
<br> 
accept() failed 
send() sent a different number of bytes than expected<p>Hello  
<b>CGI</b</p> 

Нужна помощь в фиксации это !, спасибо.

+0

'отправлено другое количество байтов, чем ожидалось', я предполагаю, что это меньшее количество байтов, поэтому я не вижу проблемы, просто отправлю остальные. И используйте ['select()'] (http://man7.org/linux/man-pages/man2/select.2.html), чтобы определить, можете ли вы читать или записывать в сокет. –

+0

Я студент университета и до сих пор учился, не могли бы вы рассказать о том, как это сделать? Спасибо –

ответ

2

Вам не нужен вызывать accept() на клиенте - вам просто нужно подключиться.

И

char echoString[4] = "helo"; 

неправильно. Это не NUL-terminated. Просто сделайте

char echoString[] = "helo"; 
+0

спасибо, что это работает :)! –

0

Если accept не удалось выполнить другие операции с розеткой, как recv. TCP-соединения не используются для обмена данными между сервером и клиентом. Вам необходимо обработать ошибки с ошибкой.

На стороне клиента у вас есть настраиваемое сообщение об ошибке на send. Это не помогает. Обычно частичные отправки не являются общими. Следовательно, ваша печать `отправляет другое количество байтов, чем ожидалось ', может вводить в заблуждение. Вам нужно найти настоящую причину.

Вызов accept в код клиента не требуется. Ее сервер, который принимает и клиентам те, которые соединяют

Использования errno и perror как - perror("Accept Failed") на все ваш системные вызовы для облегчения отладки и удаления подрамников

+0

'accept()' не работает на стороне клиента - там, где он вообще не должен вызываться, поскольку клиент не прослушивает входящие соединения. –

+0

после добавления PError я
принимают() не : Bad файловый дескриптор посыла() послал различное количество байт, чем ожидалось: Плохой дескриптор файла –

+0

Вы не должны вызывать 'accept' на клиенте боковая сторона. – Prabhu

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