Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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 TCP套接字连接被拒绝_C_Sockets_Tcp_Localhost_Client Server - Fatal编程技术网

本地主机的c TCP套接字连接被拒绝

本地主机的c TCP套接字连接被拒绝,c,sockets,tcp,localhost,client-server,C,Sockets,Tcp,Localhost,Client Server,我试图在localhost中创建一个客户机/服务器程序,但是客户机无法连接到服务器,我不知道我做错了什么 我已经试着调试程序,所有的参数似乎都正常。服务器确实绑定、连接、侦听和接受 对于客户端代码,getconnect:Invalid参数出现错误。客户端(我正在使用/Client localhost从控制台调用客户端): #包括 #包括 #包括 #包括 #包括 int main(int argc,char*argv[]) { int cd; 结构主机*hp; s_ain中的结构sockaddr_

我试图在localhost中创建一个客户机/服务器程序,但是客户机无法连接到服务器,我不知道我做错了什么

我已经试着调试程序,所有的参数似乎都正常。服务器确实绑定、连接、侦听和接受

对于客户端代码,get
connect:Invalid参数出现错误。客户端(我正在使用
/Client localhost
从控制台调用客户端):

#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int cd;
结构主机*hp;
s_ain中的结构sockaddr_;
无符号字符字节;
hp=gethostbyname(argv[1]);
bzero((char*)和s_ain,sizeof(s_ain));
s_ain.sin_family=AF_INET;
memcpy(&(s_ain.sin_addr),hp->h_addr,hp->h_length);
s_ain.sin_port=htons(1025);
cd=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);
if(连接(cd,(struct sockaddr*)和s_ain,sizeof(s_ain)=-1)){
fprintf(标准,“连接:%s\n”,strerror(errno));
返回-1;
}       
printf(“%s\n”,“有效!”);
关闭(cd);
返回0;
}
服务器:

#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
    int sd, cd;
    socklen_t size;     
    unsigned char byte;
    struct sockaddr_in s_ain, c_ain;    

    sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    bzero((char *)&s_ain, sizeof(s_ain));
    s_ain.sin_family = AF_INET;s_ain.sin_family = AF_INET;
    s_ain.sin_addr.s_addr = INADDR_ANY;
    s_ain.sin_port = htons(1025);

    if(bind(sd, (struct sockaddr *)&s_ain, sizeof(s_ain)) == -1) {
        fprintf(stderr, "%s\n", "err bind");
        return -1;
    }

    if(listen(sd, 5) == -1) {
        fprintf(stderr, "%s\n", "err listen");
        return -1;
    }

    while(1) {
        size = sizeof(c_ain);
        cd = accept(sd, (struct sockaddr *)&c_ain, &size);
        printf("%s\n", "IT WORKS !");
    }
}
#包括
#包括
#包括
#包括
内部主(空)
{
int sd,cd;
袜子尺寸;
无符号字符字节;
结构sockaddr_in s_ain,c_ain;
sd=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);
bzero((char*)和s_ain,sizeof(s_ain));
s_ain.sin_family=AF_INET;s_ain.sin_family=AF_INET;
s_ain.sin_addr.s_addr=INADDR\u ANY;
s_ain.sin_port=htons(1025);
if(绑定(sd,(结构sockaddr*)和s_ain,sizeof(s_ain))=-1){
fprintf(标准字符,“%s\n”,“err bind”);
返回-1;
}
如果(监听(sd,5)=-1){
fprintf(stderr,“%s\n”,“err listen”);
返回-1;
}
而(1){
尺寸=尺寸(c_ain);
cd=接受(sd,(结构sockaddr*)和c_ain,以及大小);
printf(“%s\n”,“有效!”);
}
}

示例中可能有输入错误,或者

if( connect(cd, (struct sockaddr*) &s_ain, sizeof(s_ain) == -1) ) {
    fprintf(stderr, "%s\n", "err connect");
    return -1;
}
有错误的括号。当前,您将使用
socklen\u t addrlen
作为
0
调用
connect
。应该是

if( connect(cd, (struct sockaddr*) &s_ain, sizeof(s_ain)) == -1) {
    fprintf(stderr, "%s\n", "err connect");
    return -1;
}
server.c中的一些修复

#include <netinet/in.h> // fix
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
    int sd, cd;
    unsigned char byte;
    struct sockaddr_in c_ain;

    sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    bzero((char *)&c_ain, sizeof(c_ain));
    c_ain.sin_family = AF_INET;
    c_ain.sin_addr.s_addr = INADDR_ANY;
    c_ain.sin_port = htons(1025);

    bind(sd, (struct sockaddr *)&c_ain, sizeof(c_ain));
    listen(sd, 5);

    struct sockaddr_in t_ain;
    while(1) {
       int size = sizeof(t_ain); // < fix
       cd = accept(sd, (struct sockaddr *)&t_ain, (socklen_t*)&size); // < fix
       printf("%s\n", "IT WORKS !");
    }
}
#包括//修复
#包括
#包括
#包括
#包括
内部主(空)
{
int sd,cd;
无符号字符字节;
c_ain中的结构sockaddr_;
sd=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);
bzero((char*)和c_ain,sizeof(c_ain));
c_ain.sin_family=AF_INET;
c_ain.sin_addr.s_addr=INADDR\u ANY;
c_ain.sinu port=htons(1025);
绑定(sd,(struct sockaddr*)和c_ain,sizeof(c_ain));
听(sd,5);
结构sockaddr_在t_ain;
而(1){
int size=sizeof(t_ain);/
还可以使用telnet测试服务器:

telnet 127.0.0.1 1025


您知道1024以下的端口号是保留的,不能由非特权应用程序使用吗?为什么不检查服务器应用程序中的错误?服务器代码中还有两种未定义的行为,都与
size
变量有关?首先,类型是错误的,它应该是
socklen\t
。其次,每次在循环中调用
accept
之前都需要对其进行初始化。请参见,例如…@JachimPleborg,我也尝试过1025,但也没有成功。顺便说一句,如果失败,请尝试打印出的值,以查看实际出现的错误。您可以使用从错误代码中获取一个可打印的字符串。@JachimPleborg我已经用
socklen\u t
和您所说的内容更新了服务器,但仍然不起作用……这个问答进入了我的“调试失败-没有将复合表达式简化为带有中间变量的简单行”书签列表。
#include <netinet/in.h> // fix
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
    int sd, cd;
    unsigned char byte;
    struct sockaddr_in c_ain;

    sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    bzero((char *)&c_ain, sizeof(c_ain));
    c_ain.sin_family = AF_INET;
    c_ain.sin_addr.s_addr = INADDR_ANY;
    c_ain.sin_port = htons(1025);

    bind(sd, (struct sockaddr *)&c_ain, sizeof(c_ain));
    listen(sd, 5);

    struct sockaddr_in t_ain;
    while(1) {
       int size = sizeof(t_ain); // < fix
       cd = accept(sd, (struct sockaddr *)&t_ain, (socklen_t*)&size); // < fix
       printf("%s\n", "IT WORKS !");
    }
}