我对套接字编程很新,但是,使用在线教程,我已经使用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();
}
}
}
答案 0 :(得分:1)
要终止字符串,请使用
recvBuff[bytesRead] = '\0';
在编写器上调用关闭(这会导致编写器刷新任何待处理的字节)
writer.WriteLine("Testing...");
writer.Close();
client.Close();