【发布时间】:2012-05-28 20:47:37
【问题描述】:
这是 .c 文件的一部分,包含在 tcp 服务器-客户端消息服务中,每个线程有一个客户端;我想在服务器线程中使用 select 来处理新的传入连接或写入缓冲区的数据,但我遇到的问题是我需要套接字文件描述符来执行客户端和服务器的操作。
在这部分代码中,服务器的套接字描述符位于 s->sd 内,但我似乎可以在此函数之外访问它,因为它返回(套接字)。
我能做什么? (为了便于阅读,省略了大部分代码)
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
typedef struct {
int sd; //id of the socket??
char *ip_addr;
int port;
} MySocket;
Socket tcp_passive_open(int port)
{
MySocket *s = (MySocket *)malloc( sizeof(MySocket) );
struct sockaddr_in addr;
s->sd = socket(PROTOCOLFAMILY, TYPE, PROTOCOL);
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = PROTOCOLFAMILY;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
if ( bind(s->sd, (struct sockaddr *)&addr, sizeof(addr)) != 0 ) {
die("tcp_open_server failed(): bind() failed");
}
s->port = port;
s->ip_addr = NULL; //INADDR_ANY ...
return (Socket)s;
}
主要:
Socket server = tcp_passive_open( PORT );
FD_SET(SOCKETDESCRIPTOR_SERVER??,&master_socketDescriptors);
【问题讨论】:
-
s 是一个指针。您尝试返回结构。而是返回指针(您需要更改函数的返回类型)。并删除所有演员表,除了 (struct sockaddr *)。还有什么是Socket?那应该是 MySocket 吗?
-
bedankt wildplasser :) 问题是虽然我想在不更改 tcp_passive_open 的情况下尝试它,但也许这是不可能的。而套接字是一种文件类型:我认为(它不是结构号)。所以你的解决方案恐怕没有多大帮助。
-
你为什么要返回 Socket,而你只是将类型 MySocket 类型化、malloc() 化并初始化。对我来说毫无意义。 (IANAB;-)
-
什么是
Socket?您的代码中没有它的定义。 -
它来自套接字 api(编辑:我将添加包含以便清楚)