【高分请教】关于Socket编程的问题

来源:百度知道 编辑:UC知道 时间:2024/07/06 20:13:45
我用C写了个多线程的服务器(每个TCP连接一个线程),想用一个线程专门统计当前进程已经建立的TCP连接情况(IP,端口),请问如何编程?

sdl = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sdl < 0) std_err();
if(setsockopt(sdl, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))
< 0) std_err();
if(bind(sdl, (struct sockaddr *)&peer, sizeof(peer))
< 0) std_err();
if(listen(sdl, SOMAXCONN)
< 0) std_err();

for(;;) {
sda = accept(sdl, (struct sockaddr *)&peer, &psz);
if(sda < 0) std_err();
if(!CreateThread(NULL, 0, func, data, 0, &tid)) close(sda);

}

……

我说一下我的思路吧,仅供参考,呵呵:首先定义全局,可以是个结构体数组,每个结构体中放3个成员,分别保存套接字、对方的IP和端口。

再次,因为每次accept函数都返回一个新的套接字,而原来的套接字仍处于监听状态。因此,在每次accept返回的时候,就可以创建一个线程,由于只能传一个参数给线程,所以可以用返回的套接字和填充之后的sockaddr结构体再构造一个结构体作为线程函数的参数。

最后,每条调用一次线程函数,就用传进来的参数填充结构体数组。

当然,每次断开连接时,要遍历结构体数组将断开的套接字清除。