user-0 提问: 套接字问题，很急

回复:
user: user-1
content: 我没分下载资源了，楼主多给我点分吧，晕了

user: user-1
content: 混点分，简单点说， 你accept连接后，没有保存创建的链接。 然后你遍历所有的套接字，一个一个接受数据，套接字，实际是文件编号 0，1，2， 分别是标准输入输出 什么的 。 然后你的套接字一般是3.4.5， 但，可能同时系统有其他socket程序，她们的套接字id为9 ，10 ，11 。 那么，你每次遍历的时候，有可能把其他进程的套接字也拿来recv，就会异常   所以，你要保证你每次遍历的套接字都是你自己accept的，同时是有数据的， 同时， 即便你套接字有数据，你接收的时候，也要判断一下是否接收被中断，如eintr  另外，即便你以上所有问题都解决，还存在你总是没有释放套接字资源的问题，你连续的连几个小时，估计系统会崩掉

user: user-0
content: 引用 3 楼 max_min_ 的回复:[quote=引用 1 楼 u012563253 的回复:] 感觉是这段有问题啊else                     {                         char szText[256];                         int nRecv =recv(fdSocket.fd_array[i], szText, strlen(szText), 0);                         if(nRecv > 0)                        // （2）可读                         {                             printf("接收到数据：%s \n", szText);                         }                         else                                // （3）连接关闭、重启或者中断                         {                             closesocket(fdSocket.fd_array[i]);                             FD_CLR(fdSocket.fd_array[i], &fdSocket);                         }                     }  这里开启新的线程来处理接收消息，让主线程accept动作！  估计都没进这里来！额外开一个线程处理recv看看！[/quote]书上的意思是用select模型，单线程做这个程序额，怎么改，楼上的方法试过了没用

user: user-2
content: 引用 1 楼 u012563253 的回复:感觉是这段有问题啊else                     {                         char szText[256];                         int nRecv =recv(fdSocket.fd_array[i], szText, strlen(szText), 0);                         if(nRecv > 0)                        // （2）可读                         {                             printf("接收到数据：%s \n", szText);                         }                         else                                // （3）连接关闭、重启或者中断                         {                             closesocket(fdSocket.fd_array[i]);                             FD_CLR(fdSocket.fd_array[i], &fdSocket);                         }                     }  这里开启新的线程来处理接收消息，让主线程accept动作！  估计都没进这里来！额外开一个线程处理recv看看！

user: user-3
content: 是不是客户端少了一个   WSACleanup();       //释放套接字资源

user: user-0
content: 感觉是这段有问题啊else                     {                         char szText[256];                         int nRecv =recv(fdSocket.fd_array[i], szText, strlen(szText), 0);                         if(nRecv > 0)                        // （2）可读                         {                             printf("接收到数据：%s \n", szText);                         }                         else                                // （3）连接关闭、重启或者中断                         {                             closesocket(fdSocket.fd_array[i]);                             FD_CLR(fdSocket.fd_array[i], &fdSocket);                         }                     }

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:请检查所有函数的返回值！  不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html 请问是客户端程序的问题吗？

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:请检查所有函数的返回值！  不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html 不好意思阿，我是初学套接字编程，实在不懂，不知道能不能稍微具体点

user: user-2
content: 引用 4 楼 u012563253 的回复:[quote=引用 3 楼 max_min_ 的回复:] [quote=引用 1 楼 u012563253 的回复:] 感觉是这段有问题啊else                     {                         char szText[256];                         int nRecv =recv(fdSocket.fd_array[i], szText, strlen(szText), 0);                         if(nRecv > 0)                        // （2）可读                         {                             printf("接收到数据：%s \n", szText);                         }                         else                                // （3）连接关闭、重启或者中断                         {                             closesocket(fdSocket.fd_array[i]);                             FD_CLR(fdSocket.fd_array[i], &fdSocket);                         }                     }  这里开启新的线程来处理接收消息，让主线程accept动作！  估计都没进这里来！额外开一个线程处理recv看看！[/quote]书上的意思是用select模型，单线程做这个程序额，怎么改，楼上的方法试过了没用[/quote]  看你的写逻辑，如果在循环体内如果一直有准备好的监听的队列的话，accept就会一直去取套接字来 进行accept这个动作的！不会进行下面的接受数据的这个动作，所以我怀疑这里出了问题的！ 而且这两个动作根本没有if else的关系在里面，不明白你的需求为什么要这样写，  建议;在accept函数调用成功后，直接处理接收消息，直接recv 然后打印看看！      或者再accept成功调用后，开启新的线程处理接受消息，

user: user-4
content: 请检查所有函数的返回值！  不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html