这是交易,我在C中编写一个简单的tcp套接字服务器(使用unix系统调用),我无法接受连接。
据我所知,我完成了服务器初始化,但是当我尝试连接到我打印出的端口时(参见下面的代码),它拒绝好像没有任何东西。
更重要的是,当我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**/
}
答案 0 :(得分:4)
你真的想收听端口零吗?尝试高端口号,最好是> 1024. / etc / services将提供有关可用端口的提示 - 但它只是一组注释,这些端口号不会被强制执行。
编辑:另一个提示。端口号应为网络顺序,因此分配应使用htons()
。可能是你得到的“随机数字”是简单的数字,因为你可能在一个小端机器(如英特尔)上显得乱码。打印时,请使用ntohs()
将其转换回来。
答案 1 :(得分:2)
在您的代码中:
而不是:
serv_addr.sin_port = 0;
试试这个:
serv_addr.sin_port=htons(2056);//Any port no.
而不是:
listen(sock_fd,32);
试试这个:
if(listen(sock_fd,SOMAXCONN)<0)//Just to be sure that you are considering max. no. of requests
{ fprintf(stderr,"error with listen");
exit(1);}
也适用于:
conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen);
添加:
if(conn_fd <0)
{
//handle the error here
}
如果这些都无法解决您的问题,那么客户端代码或服务器环境可能会出现问题。
答案 2 :(得分:2)
支持@askmish鼓舞这个
//Print port
printf("%i", serv_addr.sin_port);
变为
//Print port
printf("%i", htons(serv_addr.sin_port));