c语言accept函数 c语言ioctl函数

c语言socket编程中accept的阻塞问题

端口就是负责监听连接请求的.如果监听到该端口的请求那么就可以确定是对你这个服务器的请求.一旦这个端口被占用,那么其它任何程序都无法再使用这个端口.所以我们要避开系统常用端口,要从1024以上的端口选择.

创新互联是一家专业提供勐腊企业网站建设,专注与成都做网站、成都网站设计、H5页面制作、小程序制作等业务。10年已为勐腊众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

在服务器端

sin_port

是不可以被设置为0的,

否则客户端的确无法连接.

而客户端可以设置为0,客户端可以任意端口的,没有影响.

谁能告诉我accept()函数返回一个新的套接字,所谓新套接字怎么理解?

谁能告诉我accept()函数返回一个新的套接字,所谓新套接字就是说这个是新产生的套接字,并不是你用来accept的那个监听的套接字。

accept()函数用于一个套接口接受一个连接。accept()是c语言中网络编程的重要的函数,windows系统在#includewinsock.h ,而linux系统在#include sys/socket.h中。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数

sockfd:套接口描述字,该套接口在listen()后监听连接。

addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。

addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。

实例:

#ifndef UNICODE

#defineUNICODE

#endif

#include winsock2.h

#include stdio.h

#include windows.h

#pragmacomment(lib,"Ws2_32.lib")

int wmain(void)

{

WSADATAwsaData ;

intiResult=WSAStartup(MAKEWORD(2,2),wsaData);

if(iResult!=NO_ERROR)

{

wprintf(L "WSAStartupfailedwitherror:%ld\n",iResult);

return 1 ;

}

SOCKETListenSocket ;

ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(ListenSocket==INVALID_SOCKET)

{

wprintf(L "socketfailedwitherror:%ld\n",WSAGetLastError());

WSACleanup();

return 1 ;

}

sockaddr_inservice ;

service.sin_family=AF_INET ;

service.sin_addr.s_addr=inet_addr("127.0.0.1");

service.sin_port=htons(27015);

if(bind(ListenSocket,

(SOCKADDR*)service,sizeof(service))==SOCKET_ERROR)

{

wprintf(L"bindfailedwitherror:%ld\n",WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1 ;

}

if(listen(ListenSocket,1)==SOCKET_ERROR)

{

wprintf(L"listenfailedwitherror:%ld\n",WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1 ;

}

SOCKETAcceptSocket ;

wprintf(L "Waitingforclienttoconnect...\n");

AcceptSocket=accept(ListenSocket,NULL,NULL);

if(AcceptSocket==INVALID_SOCKET)

{

wprintf(L "accept failed with error:%ld\n",WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1 ;

}

else

wprintf(L "Clientconnected.\n");

//Nolongerneedserversocket

closesocket(ListenSocket);

WSACleanup();

return 0 ;

}

C语言 网络编程 关于accept函数的问题

你的两个调用方式最后一个参数,意义完全不同,addrlen是将addrlen的地址传给accept(是一个可以写的变量地址)

而你的后一个,是将sizeof(addr)它是一个常量,一般为4,转为指针传给accept,这个地址是不可写的


当前文章:c语言accept函数 c语言ioctl函数
文章URL:http://azwzsj.com/article/ddgpdei.html