C Server 和 C# Server 之间的通信只发送 "p" 个字符

Communication between C Server and C# Server just sending "p" character

我正在 Windows 上开发客户端-服务器应用程序。一切都很完美 运行 但是当我想从 C# 客户端向 C 服务器发送文本(例如:Hello Dude)时,它只发送 "p" 字符。我不知道为什么?谢谢。

C# - 客户端代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Net.Sockets;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string ip, nick;
            int port;

            Console.Write("Nick Giriniz : ");
            nick = Console.ReadLine();
            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse("192.168.1.37");
            System.Net.IPEndPoint remoteEP = new IPEndPoint(ipAdd, 5150);
            soc.Connect(remoteEP);

            NetworkStream ag = new NetworkStream(soc);
            BinaryReader okuyucu = new BinaryReader(ag);

            baslangic:
            byte[] byData = System.Text.Encoding.ASCII.GetBytes("Hi Dude");
            soc.Send(byData);

            Console.Write("Wait for answer");
            string reply = okuyucu.ReadString();
            Console.Write(reply );
            goto baslangic;
        }
    }
}

C - 服务器

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>


#define DEFAULT_PORT        5150
#define AZAMIUZUNLUK 1024

int g_port = DEFAULT_PORT;                  // Gelen Istekleri Dinleyecek Port
char g_szAddress[128];                      // Gelen Istekleri Dinleyecek Arayuz

DWORD WINAPI ClientThread(LPVOID lpParam)   //Dword = 32 bit isaretsiz tamsayi.
{
   SOCKET sock =(SOCKET)lpParam;
   int  ret;
   char gelenverix[512];
   char str[AZAMIUZUNLUK];
   for (;;) {
      ret = recv(sock, gelenverix, 512, 0);          //recv(socket,xxxxx, uzunluk, bayrak);
      if (ret == 0)
         break;
      if (ret == SOCKET_ERROR) {
         fprintf(stderr, "Mesajlasma Sona Erdi\n", WSAGetLastError());
         break;
      }
      if (gelenverix == '\x1b')
         break;
      putchar(gelenverix);
   }
   return 0;
}

int main(void)
{
   WSADATA wsd;
   SOCKET sListen,sClient;
   int addrSize;
   HANDLE hThread;
   DWORD dwThreadId;
   struct sockaddr_in local, client;

   if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {
      fprintf(stderr, "WSAStartup yuklemesi basarisiz!\n");
      return 1;
   } else {
      fprintf(stderr, "WSAStartup Yuklendi!\n");
   }

   sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
   if (sListen == SOCKET_ERROR) {
      fprintf(stderr, "Socket Baglantisi Basarisiz!\n", WSAGetLastError());
      return 1;
   } else {
      fprintf(stderr, "Socket Baglantisi Basarili!\n", WSAGetLastError());
   }


   local.sin_addr.s_addr = htonl(INADDR_ANY);   // ip adresimi kullan
   local.sin_family = AF_INET;                  // adres ailesi Arpa Internet protokolu
   local.sin_port = htons(g_port);              // default port numarasi

   if (bind(sListen, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR) {
      fprintf(stderr, "bind() failed: %d\n", WSAGetLastError());
      return 1;
   }
   listen(sListen, 8);                          //8 - cagri kurugunda izin verilen baglanti sayisi

   for (;;) {
      addrSize = sizeof(client);
      sClient = accept(sListen, (struct sockaddr *) &client, &addrSize);
      if (sClient == INVALID_SOCKET) {
         fprintf(stderr, "accept() failed: %d\n", WSAGetLastError());
         break;
      }
      fprintf(stderr, "Accepted client: %s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));

      hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)sClient, 0, &dwThreadId);
      if (hThread == NULL) {
         fprintf(stderr, "CreateThread() failed: %d\n", GetLastError());
         break;
      }
      CloseHandle(hThread);
   }
   closesocket(sListen);

   WSACleanup();

   return 0;
}

putchar(gelenverix) 应该让你的编译器痛苦地大喊大叫,因为它期望一个 char 并且代码传递给它一个 char*.

改用puts()。还要确保 gelenverix0 预先终止的。

     ret = recv(sock, gelenverix, 512 - 1, 0); /* One less as you need space to 0-terminate the buffer. */
     if (ret == 0)
       break;
     if (ret == SOCKET_ERROR) {
       ...
       break;
     }

     gelenverix[ret] = '[=10=]'.

     puts(gelenverix);

或者干脆

     for (size_t i = 0; i < ret; ++i) 
     { 
       putchar(gelenverix[i]); 
     }