我是unix编程的新手,并为客户端和服务器编程编写了以下代码。当我尝试运行客户端代码时,它说“连接被拒绝”。有人可以告诉我它可能是什么原因。
服务器代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <errno.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
int sockid,newsockid;
socklen_t addr_size;
char *msg="What a beautiful morning!";
int len, bytes_sent;
sockid=socket(AF_INET,SOCK_STREAM,0);
if(sockid==-1)
{
perror("socket");
exit(1);
}
else
printf("created");
struct sockaddr_in serveraddr,clientaddr;
bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(7400);
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
{
perror("bind");
return -1;
}
listen(sockid,5);
addr_size=sizeof(clientaddr);
newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&addr_size);
len = strlen(msg);
bytes_sent = send(sockid, msg, len, 0);
close(sockid);
}
客户代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <errno.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
int byte_count;
struct sockaddr_in serveraddr;
char *servername;
char buf[256];
socklen_t addr_size;
int sockfd;
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(11378);
servername=gethostbyname("localhost");
inet_pton(AF_INET,servername,&serveraddr.sin_addr);
addr_size=sizeof(serveraddr);
if(connect(sockfd,(struct sockaddr *)&serveraddr,addr_size)==-1)
{
perror("connect");
exit(1);
}
byte_count = recv(sockfd, buf, sizeof buf, 0);
printf("recv()'d %d bytes of data in buf\n", byte_count);
close(sockfd);
}
早期的帮助将不胜感激。 感谢。
答案 0 :(得分:3)
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(7400);
inet_pton(AF_INET,servername,&serveraddr.sin_addr); // here
您已将servername
传递给inet_pton()
,但未初始化!所以inet_pton()
会失败。你应该检查它的返回值。
servername=gethostbyname(); //here
addr_size=sizeof(serveraddr);
第二个问题是你没有正确使用gethostbyname()
。看一下manpage,你会看到gethostbyname()
被认为是参数,它会返回一个指针到struct hostent
,而不是像你一样指向char
的指针。您的编译器没有对此提出警告,因为您没有包含netdb.h
。
您应该检查您正在使用的所有功能的返回值,它可以避免这样的问题。你应该启用编译器的一些标志(比如 alk 在问题评论中说, -W -Wextra -Wall -pedantic 是非常好的标志)。
答案 1 :(得分:3)
检查端口。服务器端口为7400但客户端尝试使用端口号11378进行连接,因此仅拒绝连接。
答案 2 :(得分:1)
确保在您的程序中包含errno.h
任何失败后,在程序中添加行printf("%s", strerr(errno));
。任何系统调用失败都会设置正确的错误,从而使诊断问题变得简单。
答案 3 :(得分:0)
嗯,您必须确保您的服务器正在运行并正在侦听正确的端口(7400)。只需检查:“netstat -tanp”如果有什么东西在端口7400上侦听然后尝试连接。