同一局域网下两台电脑之间socket通信

时间:2022-08-25 09:02:14
本人大学生菜鸟,最近做项目,需要两台电脑在同一局域网下通信。
服务器端和客户端的程序都写好了,可以再同一电脑下通信,但到了两台电脑就连不上了。
注:两台电脑都是用校园网(应该是个局域网吧)

服务器端:
#include "InitSock.h" 
#include <stdio.h> 
#include <iostream>
using namespace std;
CInitSock initSock;     // 初始化Winsock库 

int main() 

    // 创建套节字 
    SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//用来指定套接字使用的地址格式,通常使用AF_INET
    //指定套接字的类型,若是SOCK_DGRAM,则用的是udp不可靠传输
//配合type参数使用,指定使用的协议类型(当指定套接字类型后,可以设置为0,因为默认为UDP或TCP)
    if(sListen == INVALID_SOCKET) 
    { 
        printf("Failed socket() \n"); 
        return 0; 
    } 
     
    // 填充sockaddr_in结构 ,是个结构体
/* struct sockaddr_in {

short sin_family;  //地址族(指定地址格式) ,设为AF_INET
u_short sin_port; //端口号
struct in_addr sin_addr; //IP地址
char sin_zero[8]; //空子节,设为空
} */

    sockaddr_in sin; 
    sin.sin_family = AF_INET; 
    sin.sin_port = htons(4567);  //1024 ~ 49151:普通用户注册的端口号
    sin.sin_addr.S_un.S_addr = inet_addr("211.66.11.31");//INADDR_ANY; 
     
    // 绑定这个套节字到一个本地地址 
    if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) 
    { 
        printf("Failed bind() \n"); 
        return 0; 
    } 
     
    // 进入监听模式 
//2指的是,监听队列中允许保持的尚未处理的最大连接数

    if(::listen(sListen, 2) == SOCKET_ERROR) 
    { 
        printf("Failed listen() \n"); 
        return 0; 
    } 
     
    // 循环接受客户的连接请求 
    sockaddr_in remoteAddr;  
    int nAddrLen = sizeof(remoteAddr); 
    SOCKET sClient = 0; 
    char szText[] = " TCP Server Demo! \r\n"; 
    while(sClient==0) 
    { 
        // 接受一个新连接 
//((SOCKADDR*)&remoteAddr)一个指向sockaddr_in结构的指针,用于获取对方地址
        sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); 
        if(sClient == INVALID_SOCKET) 
        { 
            printf("Failed accept()"); 
        } 
         
         
        printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); 
        continue ; 
    } 

    while(TRUE) 
    { 
        // 向客户端发送数据 
        gets(szText) ; 
        ::send(sClient, szText, strlen(szText), 0); 
         
        // 从客户端接收数据 
        char buff[256] ; 
        int nRecv = ::recv(sClient, buff, 256, 0); 
        if(nRecv > 0) 
        { 
            buff[nRecv] = '\0'; 
            printf(" 接收到数据:%s\n", buff); 
        } 
     
    } 

    // 关闭同客户端的连接 
    ::closesocket(sClient); 
         
    // 关闭监听套节字 
    ::closesocket(sListen); 

    return 0; 


客户端:
#include "InitSock.h" 
#include <stdio.h> 
#include <iostream> 
using namespace std;
CInitSock initSock;     // 初始化Winsock库 

int main() 

// 创建套节字 
SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
if(s == INVALID_SOCKET) 

printf(" Failed socket() \n"); 
return 0; 


// 也可以在这里调用bind函数绑定一个本地地址 
// 否则系统将会自动安排 

// 填写远程地址信息 
sockaddr_in servAddr;  
servAddr.sin_family = AF_INET; 
servAddr.sin_port = htons(4567); 
// 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址 
// 如果你的计算机没有联网,用直接使127.0.0.1(本机为211.66.11.31)即可 
servAddr.sin_addr.S_un.S_addr = inet_addr("211.66.11.31"); 

if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) 

printf(" Failed connect() \n"); 
return 0; 


char buff[256]; 
char szText[256] ; 

while(TRUE) 

//从服务器端接收数据 
int nRecv = ::recv(s, buff, 256, 0); 
if(nRecv > 0) 

buff[nRecv] = '\0'; 
printf("接收到数据:%s\n", buff); 


// 向服务器端发送数据 

gets(szText) ; 
szText[255] = '\0'; 
::send(s, szText, strlen(szText), 0) ; 



// 关闭套节字 
::closesocket(s); 
return 0; 

8 个解决方案

#1


代码上没有问题,检查一下防火墙,看看是否阻挡了端口4567。

#2


我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信

#3


引用 2 楼 u010253589 的回复:
我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。

#4


引用 3 楼 neustar1 的回复:
Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!

#5


引用 4 楼 u010253589 的回复:
Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!
我以前在学校就干过这种傻事。。。继续努力吧

#6


引用 5 楼 neustar1 的回复:
Quote: 引用 4 楼 u010253589 的回复:

Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!
我以前在学校就干过这种傻事。。。继续努力吧

嗯嗯,谢谢你的帮助!

#7


楼主,请问还在吗,貌似时间有点久远,我想问一下,有了程序代码后2台电脑的具体连接通信步骤是什么样的呢,比如说是直接编译呢还是需要什么调试软件呢,我是个小白,能否解答一下呢? 同一局域网下两台电脑之间socket通信

#8


引用 6 楼 u010253589 的回复:
Quote: 引用 5 楼 neustar1 的回复:

Quote: 引用 4 楼 u010253589 的回复:

Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!
我以前在学校就干过这种傻事。。。继续努力吧

嗯嗯,谢谢你的帮助!

非常感谢!!!!!!

#1


代码上没有问题,检查一下防火墙,看看是否阻挡了端口4567。

#2


我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信

#3


引用 2 楼 u010253589 的回复:
我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。

#4


引用 3 楼 neustar1 的回复:
Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!

#5


引用 4 楼 u010253589 的回复:
Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!
我以前在学校就干过这种傻事。。。继续努力吧

#6


引用 5 楼 neustar1 的回复:
Quote: 引用 4 楼 u010253589 的回复:

Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!
我以前在学校就干过这种傻事。。。继续努力吧

嗯嗯,谢谢你的帮助!

#7


楼主,请问还在吗,貌似时间有点久远,我想问一下,有了程序代码后2台电脑的具体连接通信步骤是什么样的呢,比如说是直接编译呢还是需要什么调试软件呢,我是个小白,能否解答一下呢? 同一局域网下两台电脑之间socket通信

#8


引用 6 楼 u010253589 的回复:
Quote: 引用 5 楼 neustar1 的回复:

Quote: 引用 4 楼 u010253589 的回复:

Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 u010253589 的回复:

我已经试过关闭防火墙了,也检查过端口4567并没有被占用,还是不能通信
那剩下的问题,可能就是不在一个子网内了。
确实是这样,我们学校的校园网并不是一个局域网。两电脑放在同一个路由下就可以了,IP要用无线的IP。真心感谢!
我以前在学校就干过这种傻事。。。继续努力吧

嗯嗯,谢谢你的帮助!

非常感谢!!!!!!