c# - 从 C# 客户端向 C 服务器发送消息

标签 c# c sockets

我对套接字编程相当陌生,但是,通过在线教程,我已经使用 C 成功地将一个短字符串从一台机器发送到另一台机器。

我遇到的问题是尝试从用 C# 编写的客户端发送字符串。服务器(用 C 语言编写)打印出一个空白/空字符串。

下面是在“服务器”计算机(本例中是运行 OpenWRT 的路由器)上运行的 C 代码:

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();
        }
    }
}

最佳答案

要以 null 终止字符串,请使用

recvBuff[bytesRead] = '\0'; 

并在writer上调用close(这会导致writer刷新任何挂起的字节)

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

关于c# - 从 C# 客户端向 C 服务器发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18262226/

相关文章:

c - 在 C 中舍入 float 变量以仅显示 2 位精度

c# - 我可以在 ASP.NET 中使用 C# 获取时间参数的本地化缩写吗?

c# - SQL 查询未检索到正确的结果

c# - 如何为附加属性设置动画?

c++ - 来自 2 个指针的组合缓冲区,无需复制

c# - 向聊天客户端添加安全性

c# - 将字符串拆分为一组分组数组

c - 键入对 'OSD0_WRITE' 的 undefined reference

python - 断开连接后在python中重新连接到PiCamera流

C# 异步套接字 - 线程逻辑