dar*_*pbj 3 c sockets unix-socket
事情是这样的,我正在用 C 语言(使用 unix 系统调用)编写一个简单的 tcp 套接字服务器,但我无法接受连接。
据我所知,我很好地完成了服务器初始化,但是当我尝试连接到我打印出来的端口(参见下面的代码)时,它拒绝了,就好像什么都没有一样。
更重要的是,当我 netstat 时,该端口甚至没有在使用中。我不会在当前的设置中抛出任何错误,我已经没有想法了。
int main(){
int sock_fd;
int conn_fd;
struct sockaddr_in serv_addr;
struct sockaddr_in cli_addr;
socklen_t* serlen;
socklen_t* clilen;
clilen = malloc(sizeof(socklen_t));
serlen = malloc(sizeof(socklen_t));
*serlen = sizeof(serv_addr);
*clilen = sizeof(cli_addr);
/*=============================Create Socket=============================*/
//Create Socket
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if(sock_fd<0){
fprintf(stderr,"error creating socket\n");
exit(1);}
//Initialize Server Address Struct
bzero((char *) &serv_addr, *serlen);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = 0;
/*=============================Bind Address==============================*/
//Bind socket to an address
if(bind(sock_fd,(struct sockaddr*)&serv_addr,*serlen)<0){
fprintf(stderr,"error binding\n");
exit(1);}
//Get socket data
if(getsockname(sock_fd,(struct sockaddr*)&serv_addr, serlen)<0){
fprintf(stderr,"error with socket name");
exit(1);}
/*=============================Server Started============================*/
//Listen for connections
listen(sock_fd,32);
//Print port
printf("%i", serv_addr.sin_port);
conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen);
/**Do something exciting with my new connection**/
}
Run Code Online (Sandbox Code Playgroud)
您真的想监听端口零吗?尝试使用较高的端口号,最好> 1024。/etc/services 将给出有关可用端口的提示 - 但它只是一组注释,这些端口号不是强制执行的。
编辑:另一个提示。端口号应按网络顺序排列,因此应使用分配的端口号htons()。您获得的“随机数”可能是看起来乱码的简单数字,因为您可能使用的是小端机器(如英特尔)。当您打印它们时,使用ntohs().