本地主机的c TCP套接字连接被拒绝
我试图在localhost中创建一个客户机/服务器程序,但是客户机无法连接到服务器,我不知道我做错了什么 我已经试着调试程序,所有的参数似乎都正常。服务器确实绑定、连接、侦听和接受 对于客户端代码,get本地主机的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_
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 !");
}
}