谁能告诉我accept()函数返回一个新的套接字,所谓新套接字怎么理解?

谁能告诉我accept()函数返回一个新的套接字,所谓新套接字怎么理解?,第1张

谁能告诉我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);将子进程退出,然后应该就不会有这个问题了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7620041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-07
下一篇 2023-04-07

发表评论

登录后才能评论

评论列表(0条)

保存