這是一個.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? – wildplasser
bedankt wildplasser :)問題是雖然我想嘗試它而不改變tcp_passive_open,但也許這是不可能的。而套接字是一個文件類型:我認爲(它不是結構號)。所以你的解決方案恐怕沒有多大幫助。 – Thomas
爲什麼要返回Socket,而您只需鍵入MySocket typedeffed,malloc()ed並初始化。對我沒有意義。 (IANAB ;-) – wildplasser