accept as和accept区别,accept函数的返回值是啥
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!
#define MSGSIZE 1024//信息大小
#pragma comment(lib,"ws2_32.lib")
int g_iTotalConn= 0;//连接数量
SOCKET g_CliSocketArr[FD_SETSIZE];//套接字数组
DWORD WINAPI WorkerThread(LPVOID lpParameter);//线程函数
int iaddrSize= sizeof(SOCKADDR_IN);
// Initialize Windows socket library
WSAStartup(0x0202,&wsaData);
sListen= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
local.sin_addr.S_un.S_addr= htonl(INADDR_ANY);
bind(sListen,(struct sockaddr*)&local, sizeof(SOCKADDR_IN));
CreateThread(NULL, 0, WorkerThread, NULL, 0,&dwThreadId);
//接受一个连接,返回的是客户套的套接字
sClient= accept(sListen,(struct sockaddr*)&client,&iaddrSize);
//这里client的SOCKADDR_IN client中可以取出IP
printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
// Add socket to g_CliSocketArr
g_CliSocketArr[g_iTotalConn++]= sClient;
DWORD WINAPI WorkerThread(LPVOID lpParam)//线程
struct timeval tv={1, 0};//超时时间 SELECT模型中用到的这里是1秒
char szMessage[MSGSIZE];//信息数组,事实上就是个缓冲区
FD_ZERO(&fdread);//清空fd_set结构
for(i= 0; i< g_iTotalConn; i++)
FD_SET(g_CliSocketArr[i],&fdread);//把客户套接字放到SELECT要求的数组中
//**************************************
ret= select(0,&fdread, NULL, NULL,&tv);
for(i= 0; i< g_iTotalConn; i++)
if(FD_ISSET(g_CliSocketArr[i],&fdread))
// A read event happened on g_CliSocketArr[i]
ret= recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);
if(ret== 0||(ret== SOCKET_ERROR&& WSAGetLastError()== WSAECONNRESET))
printf("Client socket%d closed.\n", g_CliSocketArr[i]);
closesocket(g_CliSocketArr[i]);//关闭这个套接字
//将数组中最后一个套接字挪到当前的位置上
g_CliSocketArr[i--]= g_CliSocketArr[--g_iTotalConn];
// We received a message from client
//如果以上没发生,那么就接收到一个客户端的信息
send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0);
1、准备好了,系统调用 accept()会有点古怪的地方的!你可以想象发生这样的事情:有人从很远的地方通过一个你在侦听(listen())的端口连接(connect())到你的机器。它的连接将加入到等待接受(accept())的队列中。你调用 accept()告诉它你有空闲的连接。它将返回一个新的套接字文件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,新的在准备发送(send())和接收( recv())数据。这就是这个过程!
2、 int accept(int sockfd, void*addr, int*addrlen);
3、 sockfd相当简单,是和 listen()中一样的套接字描述符。addr是个指向局部的数据结构 sockaddr_in的指针。这是要求接入的信息所要去的地方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给 accept之前,addrlen是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。 accept将不会将多余的字节给 addr。如果你放入的少些,那么它会通过改
4、同样,在错误时返回-1,并设置全局错误变量 errno。
5、#define MYPORT 3490/*用户接入端口*/
6、#define BACKLOG 10/*多少等待连接控制*/
7、 int sockfd, new_fd;/* listen on sock_fd, new connection on new_fd*/
8、 struct sockaddr_in my_addr;/*地址信息*/
9、 struct sockaddr_in their_addr;/* connector's address information*/
10、 sockfd= socket(AF_INET, SOCK_STREAM, 0);/*错误检查*/
11、 my_addr.sin_family= AF_INET;/* host byte order*/
12、 my_addr.sin_port= htons(MYPORT);/* short, network byte order*/
13、 my_addr.sin_addr.s_addr= INADDR_ANY;/* auto-fill with my IP*/
14、 bzero(&(my_addr.sin_zero),;/* zero the rest of the struct*/
15、/* don't forget your error checking for these calls:*/
16、 bind(sockfd,(struct sockaddr*)&my_addr, sizeof(struct sockaddr));
17、 sin_size= sizeof(struct sockaddr_in);
18、 new_fd= accept(sockfd,&their_addr,&sin_size);
19、注意,在系统调用 send()和 recv()中你应该使用新的套接字描述符 new_fd。如果你只想让一个连接进来,那么你可以使用 close()去关闭原来的文件描述符 sockfd来避免同一个端口更多的连接。
wwW.Xtw.Com.cN系统网专业的PC、手机系统开发下载平台,HarmonyOS系统、安卓、OS、windows电脑重装系统在线下载安装,操作系统平台技术学习,攻略教程,技术交流。
免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!
联系邮箱:773537036@qq.com
相关推荐