一、网络编程中select函数如何接受一个accept事件
#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);
二、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函数的内容到此结束,希望对大家有所帮助。