首页编程accept函数(accept函数的用法)

accept函数(accept函数的用法)

编程之家2023-11-0290次浏览

尊敬的读者,accept函数和accept函数的用法是当前备受关注的话题,但许多人对其仍存在疑惑。在本篇文章中,我将为你提供清晰的解释和深入的分析,希望能满足你的求知欲望。

accept函数(accept函数的用法)

网络编程中select函数如何接受一个accept事件

#include<winsock.h>

#include<stdio.h>

#define PORT 5150//端口

#define MSGSIZE 1024//信息大小

#pragma comment(lib,"ws2_32.lib")

int g_iTotalConn= 0;//连接数量

accept函数(accept函数的用法)

SOCKET g_CliSocketArr[FD_SETSIZE];//套接字数组

DWORD WINAPI WorkerThread(LPVOID lpParameter);//线程函数

int main()

{

WSADATA wsaData;

SOCKET sListen, sClient;

accept函数(accept函数的用法)

SOCKADDR_IN local, client;

int iaddrSize= sizeof(SOCKADDR_IN);

DWORD dwThreadId;

// Initialize Windows socket library

//装载套接字库

WSAStartup(0x0202,&wsaData);

// Create listening socket

//创建套接字

sListen= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Bind

//绑定

local.sin_addr.S_un.S_addr= htonl(INADDR_ANY);

local.sin_family= AF_INET;

local.sin_port= htons(PORT);

bind(sListen,(struct sockaddr*)&local, sizeof(SOCKADDR_IN));

// Listen

//监听

listen(sListen, 3);

// Create worker thread

//创建线程

CreateThread(NULL, 0, WorkerThread, NULL, 0,&dwThreadId);

while(TRUE)

{

// Accept a connection

//接受一个连接,返回的是客户套的套接字

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;

}

return 0;

}

DWORD WINAPI WorkerThread(LPVOID lpParam)//线程

{

int i;

fd_set fdread;//结构

int ret;

struct timeval tv={1, 0};//超时时间 SELECT模型中用到的这里是1秒

char szMessage[MSGSIZE];//信息数组,事实上就是个缓冲区

while(TRUE)

{

FD_ZERO(&fdread);//清空fd_set结构

for(i= 0; i< g_iTotalConn; i++)

{

FD_SET(g_CliSocketArr[i],&fdread);//把客户套接字放到SELECT要求的数组中

}

//**************************************

// We only care read event

//只关心读的情况

ret= select(0,&fdread, NULL, NULL,&tv);

if(ret== 0)

{

// Time expired超时

continue;

}

//如果SELECT返回不是0

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))

{

// Client socket closed

//客户端关闭

printf("Client socket%d closed.\n", g_CliSocketArr[i]);

closesocket(g_CliSocketArr[i]);//关闭这个套接字

if(i< g_iTotalConn- 1)

{

//将数组中最后一个套接字挪到当前的位置上

g_CliSocketArr[i--]= g_CliSocketArr[--g_iTotalConn];

}

}

else

{

// We received a message from client

//如果以上没发生,那么就接收到一个客户端的信息

szMessage[ret]='\0';

//直接回送回去

send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0);

}

}

}

}

return 0;

}

accept用法

accept: [ək'sept ]

vt.接受,同意,承担(责任等)

vi.同意,承认

Examples:

1. It is generally accepted that smoking is harmful to our health.

吸烟有害健康,这是大家公认的。

2. The police are not allowed to accept rewards.

警察是不允许接受酬金的。

3. They accepted responsibility for the accident.

他们承认了对这次事故所负的责任。

4. Can we accept his account as the true version?

我们能够相信他说的是实情吗?

5. The machine only accepts 10p coins.

这机器只收10便士的硬币.

6. Will you accept a cheque?

你收支票吗?

7. I cannot accept that he is to blame.

我认为不能责怪他.

8. She offered him a lift and he accepted(it).

她请他坐她的车,他就领情了.

accept函数的用法

accept()函数

准备好了,系统调用 accept()会有点古怪的地方的!你可以想象发生这样的事情:有人从很远的地方通过一个你在侦听(listen())的端口连接(connect())到你的机器。它的连接将加入到等待接受(accept())的队列中。你调用 accept()告诉它你有空闲的连接。它将返回一个新的套接字文件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,新的在准备发送(send())和接收( recv())数据。这就是这个过程!

函数是这样定义的:

#include<sys/socket.h>

int accept(int sockfd, void*addr, int*addrlen);

sockfd相当简单,是和 listen()中一样的套接字描述符。addr是个指向局部的数据结构 sockaddr_in的指针。这是要求接入的信息所要去的地方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给 accept之前,addrlen是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。 accept将不会将多余的字节给 addr。如果你放入的少些,那么它会通过改

变 addrlen的值反映出来。

同样,在错误时返回-1,并设置全局错误变量 errno。

现在是你应该熟悉的代码片段。

#include<string.h>

#include<sys/socket.h>

#include<sys/types.h>

#define MYPORT 3490/*用户接入端口*/

#define BACKLOG 10/*多少等待连接控制*/

main()

{

int sockfd, new_fd;/* listen on sock_fd, new connection on new_fd*/

struct sockaddr_in my_addr;/*地址信息*/

struct sockaddr_in their_addr;/* connector's address information*/

int sin_size;

sockfd= socket(AF_INET, SOCK_STREAM, 0);/*错误检查*/

my_addr.sin_family= AF_INET;/* host byte order*/

my_addr.sin_port= htons(MYPORT);/* short, network byte order*/

my_addr.sin_addr.s_addr= INADDR_ANY;/* auto-fill with my IP*/

bzero(&(my_addr.sin_zero),;/* zero the rest of the struct*/

/* don't forget your error checking for these calls:*/

bind(sockfd,(struct sockaddr*)&my_addr, sizeof(struct sockaddr));

listen(sockfd, BACKLOG);

sin_size= sizeof(struct sockaddr_in);

new_fd= accept(sockfd,&their_addr,&sin_size);

.

.

.

注意,在系统调用 send()和 recv()中你应该使用新的套接字描述符 new_fd。如果你只想让一个连接进来,那么你可以使用 close()去关闭原来的文件描述符 sockfd来避免同一个端口更多的连接。

感谢您的阅读!希望本文对解决您关于accept函数和accept函数的用法的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。

网站后台管理系统(网站后台管理系统是什么)java运行环境?java开发需要哪些环境