2013-08-15 4 views
0

Я довольно новыми для сокетов программирования, но, с помощью онлайн-учебник, я успешно отправил короткую строку из одной машины в другую, используя C.Отправка сообщения от # клиента к серверу C C

Проблема У меня есть попытка отправить строку из клиента, написанного на C#. Сервер (написанный на C) печатает пустую/пустую строку.

Вот код C, который работает на «сервер» машине (в данном случае маршрутизатор работает OpenWRT):

int main(int argc, char *argv[]) 
{ 
    int listenfd = 0, connfd = 0; 
    struct sockaddr_in serv_addr; 

    char recvBuff[1025]; 

    int bytesRead; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0); 
    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serv_addr.sin_port = htons(1234); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    printf("Listening for string on port 1234...\n"); 

    listen(listenfd, 10); 

    while(1) 
    { 
     connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

     bytesRead = recv(connfd, recvBuff, 1024, 0); // Receive string 

     if (bytesRead < 0) 
     { 
      printf("Error reading from stream\n"); 
     } 

     recvBuff[bytesRead] = 0; // null-terminate the string 

     printf("%d:%s\n", bytesRead, recvBuff); 

     close(connfd); 
     sleep(1); 
    } 
} 

При отправке этого маленьким сервера строки из другой программы C это работает именно так, как Ожидается (печатает строку, затем ждет другую). [Примечание: я не думаю, что код клиента C имеет значение, но я могу опубликовать его, если необходимо,]

Однако при попытке отправить его строку из программы на C# выводит 0: (т. е. читает 0 байт, за которым следует пустая строка), и я не могу на всю жизнь выяснить, в чем проблема. Оба приложения довольно просты, поэтому я предполагаю, что должен использовать что-то другое, кроме WriteLine (я также пробовал Write, но безрезультатно).

C# Клиент:

namespace SocketTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TcpClient client = new TcpClient("10.45.13.220", 1234); 

      Stream stream = client.GetStream(); 

      StreamWriter writer = new StreamWriter(stream); 

      writer.WriteLine("Testing..."); 

      client.Close(); 
     } 
    } 
} 
+1

Сетевые соединения *** потоки *** не сообщения, сервер не знает, сколько времени отправляется на него. Вам либо нужно использовать символ терминатора, и вы продолжаете строить свою строку до тех пор, пока не увидите ее, или вы должны префикс строки с длиной следующей строки. –

+0

Вам не нужно называть 'writer.Close()', а также закрывать поток? – simonc

+1

@simonc, по-видимому я это делаю :) Я бы зачислил вас, если бы мог. –

ответ

1

Чтобы обнулить Разорвать использовать строковые

recvBuff[bytesRead] = '\0'; 

Позвони близко на писателя (что приводит к писателю смывать все ожидающие байт)

writer.WriteLine("Testing..."); 
writer.Close(); 
client.Close(); 
+0

Да, это было. Я понял, что у меня что-то пропало с StreamWriter. Благодаря! –

+0

И спасибо за подсказку о завершении нулевой строки –

+0

@KyleG. '' \ 0'' эквивалентно '0'. Однако вы можете подумать, что нет гарантии, что данные, переданные с вашего сервера C#, будут получены одним вызовом 'recv'. Вот почему Скотт Чемберлен предложил вам создать простой протокол, который включает в себя либо длину сообщения, либо конец маркера сообщения. – simonc

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