您现在的位置是:首页» windows系统» accept as和accept区别,accept函数的返回值是啥

accept as和accept区别,accept函数的返回值是啥

2023-12-05 08:52:16
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家! #define MSGSIZE 1024//信息大小#pragma comment(lib,"ws2_32.lib")int g_iTotalConn= 0;//连接数量SOCKET

今天小编为大家分享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

标签: 函数 用法 accept