我在程序中已经设置了某口端口为TCP监听端口(比如3555),属性为SO_REUSEADDR以及非阻塞!现在,我想向客户端发送TCP消息,发出的消息端口可以使3555吗?怎么做?谢谢!

解决方案 »

  1.   

    你的需求有点像 飞鸽传书。 他是用UDP作的。你可以参照源码。
      

  2.   

    彼此不分客户端和服务端,是不是说你的这一个程序,即可以connect另一个同样的程序,也可以accept另一个同样的程序呢?
      

  3.   

    既然是TCP,就必须是服务端listen,客户端connect,服务端accept的握手流程
    只有UDP才能省略握手直接收发
      

  4.   


    我前面说过了。他这需求是跟飞鸽传书一样的。如果是tcp ,对方又如何知道你的ip呢? 如果知道你的ip那就似乎是服务端的概念了。
      

  5.   


    我的代码如下:if ((tcpsk = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)//建立tcp对应socket
    return FALSE;

    sockaddr_in myaddr;
    memset(&myaddr, 0, sizeof(myaddr));
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = INADDR_ANY;
    myaddr.sin_port = htons(3555);

    if (bind(tcpsk, (LPSOCKADDR)&myaddr, sizeof(myaddr)) != 0)
    {
    AfxMessageBox("TCP绑定失败");
    } if (ioctlsocket(tcpsk, FIONBIO, (unsigned long *)&flg) != 0)//设置为非阻塞
    return FALSE;
    if(setsockopt(tcpsk, SOL_SOCKET, SO_REUSEADDR, (char *)&flg, sizeof(flg)) != 0)
    return FALSE; if (listen(tcpsk, 3) != 0)
    return FALSE;///////////////////////////////////////////
    以上是在程序A中的tcp端口的绑定直到监听的过程,如果用同一个程序的副本B来连接时可以实现通讯的(A和B是一样的).
    但是,如果在A中,使用如下的代码去connect程序B的这个监听端口3555,发现发送不出去:
    ////////////////////////////////////////////////////////
            struct sockaddr_in youraddr;
    memset(&youraddr, 0, sizeof(youraddr));
    youraddr.sin_family = AF_INET;
    youraddr.sin_port = htons(3555);
    youraddr.sin_addr.s_addr = inet_addr("192.168.1.111");//B的IP if (::connect(tcpsk, (LPSOCKADDR)&youraddr, sizeof(youraddr)) == SOCKET_ERROR)
    {return MessageBox("发送不出去");}请问,这是为什么?
      

  6.   

    listen中的socket是不能进行connect操作的
    另外弄个socket去connect啊而且,listen中的socket也不能进行收发
    你大概没弄明白socket通信原理
    你开始监听后,即使对方主动连接你,你也并不是用监听的socket去和对方通信
    而是新建一个socket来通信,监听socket还是继续在监听
      

  7.   

    是啊,你都listen了,应该是服务监听才对,怎么可以去connect呢?
    我觉得如果楼主想实现一个程序,既可以客户端,又可以服务端的话,那就弄2个socket,一个去accept,一个去connect,而不要一个socket做2件事
      

  8.   

    谢谢两位,学习了!我的目的只有一个:就是端口重用,3555这个端口既可监听又可以连接。是不是同一个socket无所谓,,只要是同一个端口就可以了!这样的想法可能吗?
      

  9.   

    服务端统一是3555端口就行了,客户端用什么端口没必要管,通常让系统自动分配例如你用浏览器访问WEB网站,网站服务器肯定是80端口,而你浏览器通常用的是1024以上的一个随机端口
    ——并不是通信两端一定要用同一个端口的
      

  10.   

    "if(setsockopt(tcpsk, SOL_SOCKET, SO_REUSEADDR, (char *)&flg, sizeof(flg)) != 0) 
    return FALSE; "你这句话不是设了地址重用了吗?应该是可以的,服务端用了3555端口后,你客户端的socket再bind这个端口时,失败了吗?如果没有失败,说明是可以的。。你测试下。
      

  11.   

    基于非连接的那就用UDP呗
    要是想实现传输的安全性
    可以加个确认机制(和TCP一样的)
      

  12.   

    看了前面你的几个贴子,大概明白你的意思是想写一个程序既可以同时充当服务器端和客户端,其实很简单:
    一,程序监听3555端口.
    二,向别的机器的3555端口发送数据.假设一个是A机器,一个是B机器,都运行这个程序;
    A和B各自监听自己的3555端口,
    A和B都可以向对方的3555端口发送数据.
    A和B都可以在3555端口有数据到达时,回复对方.
      

  13.   

    SO_REUSEADDR的含义并不是两个socket同时共用一个端口
    SO_REUSEADDR的含义是在短连接应用中,反复调用socket()、closesocket()时,不要一直换端口
      

  14.   

    多谢楼上各位!
    再问:监听端口accept了之后,会分配一个新的端口来接收数据,那么,这个新端口在接收数据的过程中(比如大型文件),还能同时用这个新端口发送tcp连接吗?