socket C/C++编程(6)server之accept()函数创建新socket以单独读取缓存区某个client的连接信息(客户端的IP和端口,但是,不包括client端键入的数据)
2017-08-15 17:01
615 查看
1. 首先
第一类服务器socket是用于绑定某个服务器端口,第二类服务器socket用于绑定交互(读写)某个listen()缓冲区的client。
2. 代码
accept()函数创建新socket以单独读取缓存区某个client的连接信息(IP和端口,不包括客户端编辑发送的数据)。第二类读取某个client交互信息的socket不关闭的代码如下,
客户端连接之后,如下图,
服务器端显示client id(4是缓冲区clients编号的初始值,0到3是错误返回参数),如下图,
3. 代码
第二类读取某个client交互信息的socket关闭之后的代码如下,
客户端成功访问之后(client被服务器从缓冲区读取了),然后,被服务器端断掉socket连接,如下图,
该客户端如果需要再进入server之listen()函数的缓冲区,则需要再连接telnet一次。
4. 代码
服务器通过sockaddr_in结构体读取客户端信息,代码如下,
成功读取客户端的ip, 端口号,如下,
但是,目前我们还无法获取客户端发送的数据,下一步用recv()/read()解决。
参考
http://blog.csdn.net/david_xtd/article/details/7087843
第一类服务器socket是用于绑定某个服务器端口,第二类服务器socket用于绑定交互(读写)某个listen()缓冲区的client。
2. 代码
accept()函数创建新socket以单独读取缓存区某个client的连接信息(IP和端口,不包括客户端编辑发送的数据)。第二类读取某个client交互信息的socket不关闭的代码如下,
#ifdef WIN32 #include <windows.h> #else #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <arpa/inet.h> #endif #include <stdio.h> int main(int argc, char *argv[]){ // 初始化”ws2_32.lib” #ifdef WIN32 WSADATA ws; WSAStartup(MAKEWORD(2,2), &ws); #endif // 创建socket int sock = socket(AF_INET,SOCK_STREAM,0); if(sock == -1){ printf("create sock error!\n"); return -1; } // TCP Server指定端口并设置服务端端口的属性,返回(sockaddr*)&saddr unsigned short port = 8080; // 默认端口号 if(argc > 1){ port = atoi(argv[1]); } sockaddr_in saddr; // 声明端口 saddr.sin_family = AF_INET; // TCPIP协议 saddr.sin_port = htons(port); // 绑定端口号, htons()之host-to-network saddr.sin_addr.s_addr = 0; //或htonl(0) 服务器接受的IP地址 0表示接受任意内外网IP // 绑定端口到指定的socket,输入(sockaddr*)&saddr if(bind(sock, (sockaddr*)&saddr, sizeof(saddr))!=0){ printf("OS bind socks to this port %d failed\n", port); return -2; } printf("OS bind this port %d to sockets successfully!\n", port); listen(sock, 10); // 允许用户连接函数(客户socket(一个客户一个socket),最大请求数队列的长度,) int client = accept(sock,0 ,0); printf("accept client %d", client); getchar(); return 0; }
客户端连接之后,如下图,
服务器端显示client id(4是缓冲区clients编号的初始值,0到3是错误返回参数),如下图,
3. 代码
第二类读取某个client交互信息的socket关闭之后的代码如下,
#ifdef WIN32 #include <windows.h> #else #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <arpa/inet.h> #endif #include <stdio.h> int main(int argc, char *argv[]){ // 初始化”ws2_32.lib” #ifdef WIN32 WSADATA ws; WSAStartup(MAKEWORD(2,2), &ws); #endif // 创建第一类socket int sock = socket(AF_INET,SOCK_STREAM,0); if(sock == -1){ printf("create sock error!\n"); return -1; } // TCP Server指定端口并设置服务端端口的属性,返回(sockaddr*)&saddr unsigned short port = 8080; // 默认端口号 if(argc > 1){ port = atoi(argv[1]); } sockaddr_in saddr; // 声明端口 saddr.sin_family = AF_INET; // TCPIP协议 saddr.sin_port = htons(port); // 绑定端口号, htons()之host-to-network saddr.sin_addr.s_addr = 0; //或htonl(0) 服务器接受的IP地址 0表示接受任意内外网IP // 绑定端口到指定的socket,输入(sockaddr*)&saddr if(bind(sock, (sockaddr*)&saddr, sizeof(saddr))!=0){ printf("OS bind socks to this port %d failed\n", port); return -2; } printf("OS bind this port %d to sockets successfully!\n", port); listen(sock, 10); // 允许用户连接函数(客户socket(一个客户一个socket),最大请求数队列的长度,) int client = accept(sock,0 ,0); // 第二类socket: 创建一个socket专门读取缓冲区clients(这里缓冲区大小如上行listen代码所示为10) printf("accept client %d", client); #ifdef WIN32 // 读取数据的第二类socket创建后要记得关闭 closesocket(client); #else close(client); #endif //#ifdef WIN32 // 端口的第一类socket,不再交互后也要记得关闭,先二后一时堆栈思想 // closesocket(sock); //#else // close(sock); //#endif getchar(); return 0; }
客户端成功访问之后(client被服务器从缓冲区读取了),然后,被服务器端断掉socket连接,如下图,
该客户端如果需要再进入server之listen()函数的缓冲区,则需要再连接telnet一次。
4. 代码
服务器通过sockaddr_in结构体读取客户端信息,代码如下,
#ifdef WIN32 #include <windows.h> #else #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <arpa/inet.h> #endif #include <stdio.h> int main(int argc, char *argv[]){ // 初始化”ws2_32.lib” #ifdef WIN32 WSADATA ws; WSAStartup(MAKEWORD(2,2), &ws); #endif // 创建第一类socket int sock = socket(AF_INET,SOCK_STREAM,0); if(sock == -1){ printf("create sock error!\n"); return -1; } // TCP Server指定端口并设置服务端端口的属性,返回(sockaddr*)&saddr unsigned short port = 8080; // 默认端口号 if(argc > 1){ port = atoi(argv[1]); } sockaddr_in saddr; // 声明端口 saddr.sin_family = AF_INET; // TCPIP协议 saddr.sin_port = htons(port); // 绑定端口号, htons()之host-to-network saddr.sin_addr.s_addr = 0; //或htonl(0) 服务器接受的IP地址 0表示接受任意内外网IP // 绑定端口到指定的socket,输入(sockaddr*)&saddr if(bind(sock, (sockaddr*)&saddr, sizeof(saddr))!=0){ printf("OS bind socks to this port %d failed\n", port); return -2; } printf("OS bind this port %d to sockets successfully!\n", port); listen(sock, 10); // 允许用户连接函数(客户socket(一个客户一个socket),最大请求数队列的长度,) sockaddr_in caddr; // 结构体:存储客户端的相关信息:端口号和IP地址s socklen_t len = sizeof(caddr); int client = accept(sock,(sockaddr*)&caddr,&len); // 第二类socket: 创建一个socket专门读取缓冲区clients(这里缓冲区大小如上行listen代码所示为10) printf("accept client %d", client); char *ip = inet_ntoa(caddr.sin_addr); // 客户端IP地址转字符串 unsigned short cport = ntohs(caddr.sin_port);// 客户端端口号(网络字节序转本地字节序) printf("client ip: %s, port is %d\n", ip, cport); // 打印客户端连接信息 #ifdef WIN32 // 读取数据的第二类socket创建后要记得关闭 closesocket(client); #else close(client); #endif //#ifdef WIN32 // 端口的第一类socket,不再交互后也要记得关闭,先二后一是堆栈思想 // closesocket(sock); //#else // close(sock); //#endif getchar(); return 0; }
成功读取客户端的ip, 端口号,如下,
但是,目前我们还无法获取客户端发送的数据,下一步用recv()/read()解决。
参考
http://blog.csdn.net/david_xtd/article/details/7087843
相关文章推荐
- socket C/C++编程(7)server端读取client端键入的数据
- HttpClient 频繁创建连接,导致socket端口全部耗尽
- TBD socket client请求,在向远端ip:port发送时,会随机找个本地可用端口去向远端ip:port 发起net io write操作。远端accept后的sockets都共享一个端口
- thrift 获取客户端client ip TBinaryProtocol TFramedTransport TNonblockingServerSocket
- socket C/C++编程(11)windows client端使用ip,port,通过connect()连接上linux server
- socket通信,TCP协议,有多个客户端,服务器怎么向指定IP及端口的客户端发送数据!
- C# Socket TcpClient 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。
- 在linux下,扫描连接到服务器指定端口的客户端ip信息,以及每个ip有几个链接。
- socket client传文件到server,server端接收成功后给客户端反馈一个信息
- 通过远程连接socket得到客户端的IP和连接端口
- 客户端分段读取服务端的socket信息 客户端连接多台socket服务端
- Android简单实现Socket通信,client连接server后,server向client发送文字数据
- C#中用Socket网络编程的问题,从客户端把数据发送到指定的IP和端口
- hadoop单线程实现server多socket连接读取数据原理分析
- socket通信client和server应用在本地,server端应用已经在本地某端口号进行监听,但是客户端确始终建立不了连接,报错:ECONNREFUSED (Connection refuse)
- 使用ACE_SOCK_SEQPACK_Association获取socket连接的本地及远程IP端口信息
- socket的accept函数解析以及服务器和多个客户端的端口问题
- socket的accept函数解析以及服务器和多个客户端的端口问题
- hadoop单线程实现server多socket连接读取数据原理分析
- Android 使用Socket实现服务器与手机客户端的长连接二:多Client对一Server聊天