我正在使用TCP在互联网域中编写一个简单的服务器。我有工作代码创建一个套接字,将其绑定到服务器的IP地址并侦听连接。 我想使用accept()系统调用来接受连接。我已经包含了accept的手册页(http://www.linuxhowtos.org/data/6/accept.txt)中列出的标题。但我的IDE说它不知道accept()是什么。 这是我的代码:
#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 :(得分:1)
问题在于您使用C ++编译器来编译C代码。尽管存在共同的根源,但这两种语言并不相同。
C ++错误消息告诉您发生了什么 - C ++对函数的参数类型(特别是指针类型)要严格得多,因为它使用它们进行重载。另一方面,在C中,函数参数不是那么严格,指针是一个指针,如果你使用了错误的指针类型,最多会给你一个警告。