C语言socket编程怎么实现2个客户端之间通信

网上找了些,没看到什么具体答案求高人指点我知道是需要服务器转发的。比如clientA,BserverCA想要和B通信,先将数据发送到C,C接受到后怎么转发给B呢,该数据包... 网上找了些,没看到什么具体答案
求高人指点
我知道是需要服务器转发的。比如client A,B server C
A想要和B通信,先将数据发送到C,C接受到后怎么转发给B呢,该数据包中应该是自定义协议,里面有

类似可以确定B的信息吧,比如说B的ip地址,这样可以通过ip地址将信息转发给B

但是不知道这样对不对,另外我也不知道这怎么实现
展开
 我来答
tattackor
2015-06-07 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:877万
展开全部
  1. 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

  2. 下面用Socket实现一个windows下的c语言socket()通信例子,这里我们客户端传递一个字符串,服务器端进行接收。

    【服务器端】
    #include "stdafx.h"
    #include <stdio.h>
    #include <winsock2.h>
    #include <winsock2.h>
    #define SERVER_PORT 5208 //侦听端口
    void main()
    {
        WORD wVersionRequested;
        WSADATA wsaData;
        int ret, nLeft, length;
        SOCKET sListen, sServer; //侦听套接字,连接套接字
        struct sockaddr_in saServer, saClient; //地址信息   
        char *ptr;//用于遍历信息的指针   
        //WinSock初始化
        wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
        ret=WSAStartup(wVersionRequested, &wsaData);
        if(ret!=0)
        {
            printf("WSAStartup() failed!\n");
            return;
        }
        //创建Socket,使用TCP协议
        sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sListen == INVALID_SOCKET)
        {
            WSACleanup();
            printf("socket() faild!\n");
            return;
        }
        //构建本地地址信息
        saServer.sin_family = AF_INET; //地址家族
        saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
        saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址
     
        //绑定
        ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
        if (ret == SOCKET_ERROR)
        {
            printf("bind() faild! code:%d\n", WSAGetLastError());
            closesocket(sListen); //关闭套接字
            WSACleanup();
            return;
        }
     
        //侦听连接请求
        ret = listen(sListen, 5);
        if (ret == SOCKET_ERROR)
        {
            printf("listen() faild! code:%d\n", WSAGetLastError());
            closesocket(sListen); //关闭套接字
            return;
        }
     
        printf("Waiting for client connecting!\n");
        printf("Tips: Ctrl+c to quit!\n");
        //阻塞等待接受客户端连接
     while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
     {
      length = sizeof(saClient);
      sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
      if (sServer == INVALID_SOCKET)
      {
       printf("accept() faild! code:%d\n", WSAGetLastError());
       closesocket(sListen); //关闭套接字
       WSACleanup();
       return;
      }       
      char receiveMessage[5000];
       nLeft = sizeof(receiveMessage);
      ptr = (char *)&receiveMessage;
      while(nLeft>0)
      {
       //接收数据
       ret = recv()(sServer, ptr, 5000, 0);
       if (ret == SOCKET_ERROR)
       {
        printf("recv() failed!\n");
        return;
       }
       if (ret == 0) //客户端已经关闭连接
       {
        printf("Client has closed the connection\n");
        break;
       }
       nLeft -= ret;
       ptr += ret;
      }  
        printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。
     
     }
      //  closesocket(sListen);
      //  closesocket(sServer);
      //  WSACleanup();
    }
    【客户端】
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #define SERVER_PORT 5208 //侦听端口
    void main()
    {
       WORD wVersionRequested;
       WSADATA wsaData;
       int ret;
       SOCKET sClient; //连接套接字
       struct sockaddr_in saServer; //地址信息
       char *ptr;
       BOOL fSuccess = TRUE;
       //WinSock初始化
       wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
       ret = WSAStartup(wVersionRequested, &wsaData);
       if(ret!=0)
       {
            printf("WSAStartup() failed!\n");
            return;
       }
       //确认WinSock DLL支持版本2.2
       if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
       {
            WSACleanup();
            printf("Invalid WinSock version!\n");
            return;
       }
       //创建Socket,使用TCP协议
       sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
       if (sClient == INVALID_SOCKET)
       {
            WSACleanup();
            printf("socket() failed!\n");
            return;
       }
       //构建服务器地址信息
       saServer.sin_family = AF_INET; //地址家族
       saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序
       saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");
       //连接服务器
       ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
       if (ret == SOCKET_ERROR)
       {
            printf("connect() failed!\n");
            closesocket(sClient); //关闭套接字
            WSACleanup();
            return;
       }
     
     
       char sendMessage[]="hello this is client message!";
       ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);
       if (ret == SOCKET_ERROR)
       {
            printf("send() failed!\n");
       }
       else
            printf("client info has been sent!");
       closesocket(sClient); //关闭套接字
       WSACleanup();
    }
百度网友471ccf5f4
2014-04-25 · TA获得超过323个赞
知道小有建树答主
回答量:342
采纳率:25%
帮助的人:123万
展开全部
如果只是两个客户端和一个服务器,可通过服务器转发即可,两个客户端连接到服务器,服务器把从A接收到的发给B,把从B接收到的发给A即可,如果要做成多个客户端的,则要给各个客户端分配ID,服务端好根据各个客户端和消息要转发送给客户端的ID来确定消息发送对象。
更多追问追答
追问
说了等于没说,服务器怎么将数据发送给指定的客户端呢
追答
服务端给各个客户端分配一个独立不重复的ID,在客户端登陆时根据认证参数来查找ID。客户端发送消息时要指定客户端的一个独立身份信息,可以是ID,也可以是其他,服务端可通过查询来获取ID以及客户端当前是否连接上等来对客户端发送的消息进行响应或者存储等客户端上线后再转发。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-10-29
展开全部
11111111111111111111
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式