Я довольно новыми для сокетов программирования, но, с помощью онлайн-учебник, я успешно отправил короткую строку из одной машины в другую, используя 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();
}
}
}
Сетевые соединения *** потоки *** не сообщения, сервер не знает, сколько времени отправляется на него. Вам либо нужно использовать символ терминатора, и вы продолжаете строить свою строку до тех пор, пока не увидите ее, или вы должны префикс строки с длиной следующей строки. –
Вам не нужно называть 'writer.Close()', а также закрывать поток? – simonc
@simonc, по-видимому я это делаю :) Я бы зачислил вас, если бы мог. –