30dayMakeCppServer
30dayMakeCppServer copied to clipboard
day1 请问各位大佬使用 day2 的错误提示添加到 day1 的 server 中是否有遇到 bind error:Invalid argument ?bind 是在 listen 前调用啊,在腾讯云 ubuntu20.04 上写的,有大佬知道怎么解决 ?
#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;
}
你绑定监听都两次了,第二次不就报错了吗
很基础的C语言问题,建议先去学一学C语言,可以看看C Primer或者谭浩强的入门教材,不然可能会走弯路~
是的,绑定了两次,我当时没有注意这个细微的操作,没有将绑定的值赋值给一个变量,后面才发现,谢谢
很基础的C语言问题,建议先去学一学C语言,可以看看C Primer或者谭浩强的入门教材,不然可能会走弯路~
谢谢大佬