Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言的套接字编程不能远程工作_C_Sockets_Winsock - Fatal编程技术网

c语言的套接字编程不能远程工作

c语言的套接字编程不能远程工作,c,sockets,winsock,C,Sockets,Winsock,我正试图用c语言编写一个带有graphics.h库的在线象棋游戏。 我知道它很古老,但我想学习博弈论和套接字的基础知识 我已经用127.0.0.1试过了,效果很好。通信就像一个象棋游戏一样完成,这就是为什么我写了这样的代码 问题是,当我试图在另一台计算机上运行客户端程序时(在本例中,ip是我计算机的ip),它不起作用。我已经关闭了防火墙,但它没有解决。我确信它在本地工作 谢谢你的帮助,如果我做错了,请原谅我 这是我的服务器 #include<stdio.h> #include<

我正试图用c语言编写一个带有graphics.h库的在线象棋游戏。 我知道它很古老,但我想学习博弈论和套接字的基础知识

我已经用127.0.0.1试过了,效果很好。通信就像一个象棋游戏一样完成,这就是为什么我写了这样的代码

问题是,当我试图在另一台计算机上运行客户端程序时(在本例中,ip是我计算机的ip),它不起作用。我已经关闭了防火墙,但它没有解决。我确信它在本地工作

谢谢你的帮助,如果我做错了,请原谅我

这是我的服务器

#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define BUFLEN 512  //Max length of buffer
#define PORT 312   //The port on which to listen for incoming data         
int main(){
SOCKET s;
struct sockaddr_in server, si_other;
int slen , recv_len;
char buf[BUFLEN];
WSADATA wsa;
slen = sizeof(si_other) ;
//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
    printf("Failed. Error Code : %d",WSAGetLastError());
    exit(EXIT_FAILURE);
}
printf("Initialised.\n");

//Create a socket
if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET){
    printf("Could not create socket : %d" , WSAGetLastError());
}
printf("Socket created.\n");
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( PORT );
//Bind
if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR){
    printf("Bind failed with error code : %d" , WSAGetLastError());
    exit(EXIT_FAILURE);
}
puts("Bind done");
char message[500];
//keep listening for data
char msg[50];
int order=0;
while(1){
    memset(buf,'\0', BUFLEN);
    memset(msg,'\0',50);
    printf("Waiting for data...");
    fflush(stdout);
     if(order==1){
        gets(msg);
        sendto(s, msg, 20,0, (struct sockaddr*) &si_other, slen);           
     }
     if( recvfrom(s, buf, 20, 0, (struct sockaddr *) &si_other, &slen) &&       
     order==0){
        puts(buf);
        order=1;
     }
    printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr),
    ntohs(si_other.sin_port));
    printf("Data: %s\n" , buf);
}
closesocket(s);
WSACleanup();
return 0;
}
#包括
#包括
#pragma注释(lib,“ws2_32.lib”)//Winsock库
#定义BUFLEN 512//缓冲区的最大长度
#定义端口312//侦听传入数据的端口
int main(){
插座;
服务器中的结构sockaddr_,其他;
里克斯伦国际酒店;
char-buf[BUFLEN];
WSADATA wsa;
slen=sizeof(si_其他);
//初始化winsock
printf(“\n初始化Winsock…”);
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
printf(“失败。错误代码:%d”,WSAGetLastError());
退出(退出失败);
}
printf(“已初始化。\n”);
//创建一个套接字
if((s=套接字(AF_INET,SOCK_DGRAM,0))==无效的套接字){
printf(“无法创建套接字:%d”,WSAGetLastError());
}
printf(“已创建套接字。\n”);
//在结构中准备sockaddr_
server.sinu family=AF\u INET;
server.sin\u addr.s\u addr=INADDR\u ANY;
server.sin_port=htons(端口);
//束缚
if(绑定,(结构sockaddr*)和服务器,sizeof(服务器))==SOCKET\u错误){
printf(“绑定失败,错误代码:%d”,WSAGetLastError());
退出(退出失败);
}
看跌期权(“绑定完成”);
字符消息[500];
//继续监听数据
半焦味精[50];
整数阶=0;
而(1){
memset(buf,'\0',BUFLEN);
memset(msg,'\0',50);
printf(“等待数据…”);
fflush(stdout);
如果(顺序==1){
获取(msg);
发送至(s,msg,20,0,(结构sockaddr*)和si_other,slen);
}
如果(从(s,buf,20,0,(结构sockaddr*)和其他系统和系统)接收
订单==0){
put(buf);
顺序=1;
}
printf(“从%s接收的数据包:%d\n”,inet\u ntoa(si\u other.sin\u addr),
ntohs(si_other.sin_port));
printf(“数据:%s\n”,buf);
}
插座;
WSACleanup();
返回0;
}
和客户

#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define SERVER "127.0.0.1"  //ip address of udp server
#define BUFLEN 512  //Max length of buffer
#define PORT 312  //The port on which to listen for incoming data

int main(void){
struct sockaddr_in si_other;
int s, slen=sizeof(si_other);
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;
//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
    printf("Failed. Error Code : %d",WSAGetLastError());
    exit(EXIT_FAILURE);
}
printf("Initialised.\n");
//create socket
if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR){
    printf("socket() failed with error code : %d" , WSAGetLastError());
    exit(EXIT_FAILURE);
}
//setup address structure
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
int order=1;
//start communication
while(1){
    printf("Enter message : ");
    gets(message);
    //send the message
    if (sendto(s, message,20 , 0 , (struct sockaddr *) &si_other, slen) 
    && order==1){
       order=0;
    }
   if(recvfrom(s, buf, 20, 0, (struct sockaddr *) &si_other, &slen) && 
   order==0){
        order=1;
        puts(buf);
    }
    memset(buf,'\0', BUFLEN);
    puts(buf);
}
closesocket(s);
WSACleanup();
return 0;
}
#包括
#包括
#pragma注释(lib,“ws2_32.lib”)//Winsock库
#定义服务器“127.0.0.1”//udp服务器的ip地址
#定义BUFLEN 512//缓冲区的最大长度
#定义端口312//侦听传入数据的端口
内部主(空){
si_other中的结构sockaddr_;
int s,slen=sizeof(si_其他);
char-buf[BUFLEN];
字符消息[BUFLEN];
WSADATA wsa;
//初始化winsock
printf(“\n初始化Winsock…”);
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
printf(“失败。错误代码:%d”,WSAGetLastError());
退出(退出失败);
}
printf(“已初始化。\n”);
//创建套接字
if((s=套接字(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==套接字错误){
printf(“套接字()失败,错误代码:%d”,WSAGetLastError());
退出(退出失败);
}
//设置地址结构
memset((char*)&si_other,0,sizeof(si_other));
si_other.sin_family=AF_INET;
si_other.sin_port=htons(port);
si_other.sin_addr.S_un.S_addr=inet_addr(服务器);
整数阶=1;
//开始沟通
而(1){
printf(“输入消息:”);
获取(消息);
//发送消息
如果(发送到(s,消息,20,0,(结构sockaddr*)和其他,slen)
&&订单==1){
顺序=0;
}
如果(从(s,buf,20,0,(结构sockaddr*)和其他系统和系统)接收
订单==0){
顺序=1;
put(buf);
}
memset(buf,'\0',BUFLEN);
put(buf);
}
插座;
WSACleanup();
返回0;
}

您的服务器正在运行吗?我不知道它在Windows上是如何工作的,但是小于
1024的端口是有特权的,通常需要绑定到它们的程序作为超级用户或管理员用户运行。在client.c的第五行中,将服务器ip地址从127.0.0.1更改为服务器的ip地址。127.0.0.1仅当客户端和服务器在同一台计算机上时才起作用。@在本例中,PRENX yes服务器是我自己的计算机,客户端是我朋友的计算机。我用我从whatismyip.com学到的ip更改服务器ip。@某个程序员服务器是我自己的计算机,客户端是我朋友的计算机。所以服务器正在运行:)另外,您知道UPD不可靠吗?数据包通过的每个网络都会增加其发生故障甚至丢失的机会。您的服务器正在运行吗?我不知道它在Windows上是如何工作的,但是小于
1024的端口是有特权的,通常需要绑定到它们的程序作为超级用户或管理员用户运行。在client.c的第五行中,将服务器ip地址从127.0.0.1更改为服务器的ip地址。127.0.0.1仅当客户端和服务器在同一台计算机上时才起作用。@在本例中,PRENX yes服务器是我自己的计算机,客户端是我朋友的计算机。我用我从whatismyip.com学到的ip更改服务器ip。@某个程序员服务器是我自己的计算机,客户端是我朋友的计算机。所以服务器正在运行:)另外,您知道UPD不可靠吗?数据包通过的每一个网络都会增加其发生故障甚至丢失的机会。