Ale*_*eix 8 c unix sockets fork file-descriptor
我知道这个问题似乎是典型的,并且多次回答,但我认为如果您阅读细节并不常见(我没有找到它).
关键是我在c中开发了一个unix服务,它打开一个套接字并等待连接,当我有一个连接时,我创建一个新进程来处理它,因此可以同时打开多个连接.
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
Run Code Online (Sandbox Code Playgroud)
后来(后和其他一些方法里面和代码)子进程保存连接信息BBDD和我也需要,在那一时刻,以获取IP地址是打开的连接正在接受治疗.
因为可以同时存在多个连接,并且我传递给accept方法的变量struct sockaddr_in clientaddr是为所有进程共享的,所以我不确定以后从这种方式获取IP地址信息是个好主意,因为那时我可以从另一个连接打开获取IP地址.
我希望能够从accept方法(返回的整数)中获取的文件描述符int newfd中访问IP地址.可能吗?或者我误解了文件描述符函数?
Ale*_*eix 13
好.感谢@alk和@rileyberton,我找到了正确的方法,getpeername:
int sockfd;
void main(void) {
//[...]
struct sockaddr_in clientaddr;
socklen_t clientaddr_size = sizeof(clientaddr);
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_size);
//fork() and other code
foo(newfd);
//[...]
}
void foo(int newfd) {
//[...]
struct sockaddr_in addr;
socklen_t addr_size = sizeof(struct sockaddr_in);
int res = getpeername(newfd, (struct sockaddr *)&addr, &addr_size);
char *clientip = new char[20];
strcpy(clientip, inet_ntoa(addr.sin_addr));
//[...]
}
Run Code Online (Sandbox Code Playgroud)
所以现在在不同的过程中,我可以获得clientip发起连接的客户端的IP地址(在"字符串中" ),该连接仅携带newfd使用accept方法获得的文件描述符.
| 归档时间: |
|
| 查看次数: |
18577 次 |
| 最近记录: |