七月网

accept函数(accept函数返回值)

七月网2070

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

#define MSGSIZE 1024//信息大小

accept函数(accept函数返回值)

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

二、accept函数的用法

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来避免同一个端口更多的连接。

三、vfp中input和accept命令有什么区别

1、同为 FoxPro命令,后面同样都要跟上:To xxx(xxx为变量名)。

2、都是从键盘直接接收数据的命令。在当今的 Visual时代,大多使用文本框控件

3、Accept只能接收字符串数据,而且输入时不能加界定符,否则系统会把界定符

4、作为字符串的一部分来进行处理而导致出错。

5、Input可以接收各种类型数据,但输入字符串时一定要加上界定符,诸如半角

6、的双引号,或半角的方括号等等,输入逻辑型的字符时,要用圆点来作

7、界定符(如.T.及.F.),输入日期型字符时,则一定要用半角的大

8、括号或曰半角的花括号来界定(如{^2009-12-8}。

9、用 Input输入时,若不加界定符,则会出现以下情况:

10、若输入的内容全是数字,则将该内容作为数字型数据来处理;

11、若输入的内容是数字打头的数据,则从第一个字符开始截取,直到非数

12、字字符为止,再将截取的数据转换成数字型数据:

13、若输入的内容是字母打头的数据,则将该内容作为变量来处理。

14、如果事声明了变量,则将已存在的变量的值赋给

15、如果事先没作声明,屏显:〔'xxx'变量没有找到。〕

16、系统等待再次输入,直到输入的内容符合要求、或按〔Esc〕键为止。

17、纠正你一个错误:?type(a),若按你这句运行,FoxPro/VFP会有出错提示:

18、Invalid function argument value, type,or count.

19、意为:函数的参数值、型态或数目不正确。

关于accept函数的内容到此结束,希望对大家有所帮助。