2016-12-21 15 views
-1

我正在使用TCP在互联网域中编写一个简单的服务器。我有创建套接字的工作代码,将它绑定到服务器的IP地址并监听连接。 我想使用accept()系统调用来接受连接。我已包含accept的手册页(http://www.linuxhowtos.org/data/6/accept.txt)中列出的标题。但是我的IDE说它不知道accept()是什么。 这里是我的代码:如何接受在OS X上运行的简单TCP服务器中的套接字连接?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include "tcp_server.h" 

void error(char* msg) 
{ 
    perror(msg); 
    exit(1); 
} 

tcp_server::tcp_server(int portno) 
{ 
    sockfd_ = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd_ < 0) 
    { 
     error("ERROR opening socket on server."); 
    } 

    bzero((char *) &serv_addr_, sizeof(serv_addr_)); 

    serv_addr_.sin_family = AF_INET; 
    serv_addr_.sin_port = htons(portno); 
    serv_addr_.sin_addr.s_addr = INADDR_ANY; 

    if (bind(sockfd_, (struct sockaddr *) &serv_addr_, sizeof(serv_addr_)) < 0) 
    { 
     error("ERROR on binding socket to server address."); 
    } 

    listen(sockfd_, 5); 

    clilen_ = sizeof(cli_addr_); 
    newsockfd_ = accept(sockfd_, (struct sockaddr *) &cli_addr_, &clilen_); 
} 

我调用accept()在上面贴的最后一行。是不是接受()在OS X下可用?我该如何做到这一点?

这里是 “tcp_server.h”:

#pragma once 

class tcp_server 
{ 
public: 
    tcp_server(int portno); 
    ~tcp_server(); 
    void set_cli_addr(); 

private: 
    int sockfd_, newsockfd_, portno_, clilen_, n_; 
    char buffer_[256]; 
    struct sockaddr_in serv_addr_, cli_addr_; 

}; 

我收到以下错误,当我手动编译tcp_server.cpp:

tcp_server.cpp:53:18: error: no matching function for call to 'accept' 
newsockfd_ = accept(sockfd_, (struct sockaddr *) &cli_addr_, &clilen_); 
      ^~~~~~ 
/usr/include/sys/socket.h:681:5: note: candidate function not viable: no known conversion from 'int *' to 'socklen_t *' (aka 'unsigned int *') for 3rd argument 
int  accept(int, struct sockaddr * __restrict, socklen_t * __restrict) 
+0

'接受()'可用,并且有合适的头文件包括:('在')。你遇到了什么错误?你有没有试过从命令行编译它?我试着编译你的代码,但是我没有头文件'tcp_server.h'。 –

+0

嗯,['accept'](http://www.manpages.info/macosx/accept.2.html)应该_OSX_下是可用的。你没有一个叫做“accept”的变量吗?什么是完整的错误信息? – CristiFati

+1

_the compiler_说什么? – ForceBru

回答

0

的问题是,您使用的是C++编译器编译C代码。尽管有共同的根源,但两种语言并不相同。

C++的错误消息告诉您是怎么回事 - C++更加严格的有关类型参数的函数(尤其是指针类型),因为它使用它们超载。在C语言中,函数参数不是那么严格,指针是指针,如果使用错误的指针类型,最多只会给出一个警告。

相关问题