30dayMakeCppServer icon indicating copy to clipboard operation
30dayMakeCppServer copied to clipboard

day1 请问各位大佬使用 day2 的错误提示添加到 day1 的 server 中是否有遇到 bind error:Invalid argument ?bind 是在 listen 前调用啊,在腾讯云 ubuntu20.04 上写的,有大佬知道怎么解决 ?

Open Lilyan-code opened this issue 2 years ago • 4 comments

#include <cstdio>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstring>
#include <cstdlib>

using namespace std;

void errif(bool condition, const char *errmsg){
    if(condition){
        perror(errmsg);
        exit(EXIT_FAILURE);
    }
}

int main() {
	// 创建 socket
	int sockfd = socket(AF_INET, SOCK_STREAM, 0); 

	// 声明专用sockaddr_in socket 地址
	struct sockaddr_in serv_addr;
	errif(sockfd == -1, "sockfd create error");
	// 初始化地址信息为 0
	bzero(&serv_addr, sizeof(serv_addr));
	// socket地址中 family 表示 IP 地址类型
	serv_addr.sin_family = AF_INET;
	// socket 地址中, sin_addr表示 IPv4 地址结构体,用网络字节序表示
	// inet_addr将用于十进制字符串表示转化为网络字节序整数表示
	serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	// socket 地址中, sin_port表示端口号,要用网络字节序表示
	// htons: host to network short
	serv_addr.sin_port = htons(8888);

	// 将 server 地址和文件描述符绑定
	bind(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr));
	errif(bind(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr)) == -1, "bind failed");
	// 监听 socket 端口
	listen(sockfd, SOMAXCONN);
	errif(listen(sockfd, SOMAXCONN) == -1, "listen failed");
	// 声明客户端地址
	struct sockaddr_in clnt_addr;
	// 计算客户端地址所占大小
	socklen_t clnt_addr_len = sizeof(clnt_addr);
	// 初始化客户端地址
	bzero(&clnt_addr, sizeof(clnt_addr));

	// 客户端文件描述符为接收
	int clnt_sockfd = accept(sockfd, (sockaddr*)&clnt_addr, &clnt_addr_len);
	
	printf("new client fd%d! IP:%s Port: %d\n", clnt_sockfd, inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port));
	return 0;
}

Lilyan-code avatar Jul 21 '22 13:07 Lilyan-code

你绑定监听都两次了,第二次不就报错了吗

Twilighter9527 avatar Jul 25 '22 01:07 Twilighter9527

很基础的C语言问题,建议先去学一学C语言,可以看看C Primer或者谭浩强的入门教材,不然可能会走弯路~

yuesong-feng avatar Jul 25 '22 02:07 yuesong-feng

是的,绑定了两次,我当时没有注意这个细微的操作,没有将绑定的值赋值给一个变量,后面才发现,谢谢

Lilyan-code avatar Jul 25 '22 07:07 Lilyan-code

很基础的C语言问题,建议先去学一学C语言,可以看看C Primer或者谭浩强的入门教材,不然可能会走弯路~

谢谢大佬

Lilyan-code avatar Jul 25 '22 07:07 Lilyan-code