이것은 쓰레드 당 하나의 클라이언트를 가진 tcp 서버 - 클라이언트 메시지 서비스에 포함 된 .c 파일의 일부이다. 서버 스레드 내부에서 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을 변경하지 않고 시도하고 싶지만 가능하지 않을 수도 있습니다. 그리고 socket은 파일 형식입니다. (struct no가 아니라) 생각합니다. 그래서 당신은 해결책이 아닙니다. 나는 두려워합니다. – Thomas
왜 MySocket 형식의 typedeffed, malloc() ed 및 initialised 중 왜 Socket을 반환하려고합니까? 나 한테 이해가 안돼. (IANAB ;-) – wildplasser