![谁能告诉我accept()函数返回一个新的套接字,所谓新套接字怎么理解?,第1张 谁能告诉我accept()函数返回一个新的套接字,所谓新套接字怎么理解?,第1张](/aiimages/%E8%B0%81%E8%83%BD%E5%91%8A%E8%AF%89%E6%88%91accept%28%29%E5%87%BD%E6%95%B0%E8%BF%94%E5%9B%9E%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9A%84%E5%A5%97%E6%8E%A5%E5%AD%97%2C%E6%89%80%E8%B0%93%E6%96%B0%E5%A5%97%E6%8E%A5%E5%AD%97%E6%80%8E%E4%B9%88%E7%90%86%E8%A7%A3%3F.png)
谁能告诉我accept()
函数返回一个新的套接字,所谓新套接字就是说这个是新产生的套接字,并不是你用来accept的那个监听的套接字。accept()函数用于一个套
接口接受一个连接。accept()是c语言中网络编程的重要的函数,windows系统在#include<winsock.h>,而linux系统在#include <sys/socket.h>中。int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
参数sockfd:套接口描述字,该套接口在listen()后监听连接。addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。实例:#ifndef UNICODE#defineUNICODE#endif#include <winsock2.h>#include <stdio.h>#include <windows.h>#pragmacomment(lib,"Ws2_32.lib")int wmain(void){WSADATAwsaDataintiResult=WSAStartup(MAKEWORD(2,2),&wsaData) if(iResult!=NO_ERROR){wprintf(L "WSAStartupfailedwitherror:%ld\n",iResult) return 1}SOCKETListenSocketListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) if(ListenSocket==INVALID_SOCKET){wprintf(L "socketfailedwitherror:%ld\n",WSAGetLastError()) WSACleanup() return 1}sockaddr_inserviceservice.sin_family=AF_INETservice.sin_addr.s_addr=inet_addr("127.0.0.1") service.sin_port=htons(27015) if(bind(ListenSocket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR){wprintf(L"bindfailedwitherror:%ld\n",WSAGetLastError()) closesocket(ListenSocket) WSACleanup() return 1}if(listen(ListenSocket,1)==SOCKET_ERROR){wprintf(L"listenfailedwitherror:%ld\n",WSAGetLastError()) closesocket(ListenSocket) WSACleanup() return 1}SOCKETAcceptSocketwprintf(L "Waitingforclienttoconnect...\n") AcceptSocket=accept(ListenSocket,NULL,NULL) if(AcceptSocket==INVALID_SOCKET){wprintf(L "accept failed with error:%ld\n",WSAGetLastError()) closesocket(ListenSocket) WSACleanup() return 1}else wprintf(L "Clientconnected.\n") //Nolongerneedserversocketclosesocket(ListenSocket) WSACleanup() return 0 }可能是你的fork 之后产生的子进程拷贝的代码,它那里执行了accept,所以导致相同,你试着在每个fork之后的函数中用个exit(1);将子进程退出,然后应该就不会有这个问题了。
评论列表(0条)