原文:http://blog.csdn.net/gukesdo/article/details/6889594
#include <iostream> #include <winsock.h> #include <stdio.h> #pragma comment(lib, "wsock32") using namespace std; void main() { int ret = 0; WSADATA wsadata; WORD version = MAKEWORD(2,0); ret = WSAStartup(version,&wsadata); //服务器端口创建 SOCKET m_hServerSocket; m_hServerSocket = socket(AF_INET,SOCK_STREAM,0); //服务器端口绑定 SOCKADDR_IN m_addr; m_addr.sin_family = AF_INET; m_addr.sin_addr.S_un.S_addr = INADDR_ANY;//如果服务器是单网卡的,则就是这块网卡的ip地址;如果是多网卡,则是其中的任意一块的ip地址 m_addr.sin_port = htons(10000); ret = bind(m_hServerSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr)); //服务器端口开始监听 ret = listen(m_hServerSocket,10);//第二个参数指定最大申请的连接数 WSADATA cli_wsadata; ret = WSAStartup(version,&cli_wsadata); //客户端端口创建 SOCKET m_hClientSocket; m_hClientSocket = socket(AF_INET,SOCK_STREAM,0); //客户端向服务器发送连接请求 SOCKADDR_IN m_addr1; m_addr1.sin_family = AF_INET; m_addr1.sin_addr.S_un.S_addr = inet_addr("192.168.100.57");//服务器的ip地址 m_addr1.sin_port = htons(10000);//服务器socket的端口号 ret = connect(m_hClientSocket,(LPSOCKADDR)&m_addr1,sizeof(m_addr1));//从客户端端口m_hClientSocket想服务器端口m_addr1发送连接请求 //0xCD,0xCD,0xCD,0XCD. 因为DEBUG为每个字节初始化0xcd(204),你未正确取得对方IP,并且你的变量未初始化的结果。 //开始使用accept和getpeername一直返回204.204.204.204的原因 SOCKET com_Sock; SOCKADDR_IN addr_conn; int nSize = sizeof(addr_conn); //initialize the memory block via the memset function memset((void *)&addr_conn,0,sizeof(addr_conn)); com_Sock = accept(m_hServerSocket,NULL,NULL); //从连接队列中取第一个连接进行通信 //开始时候错误是因为把第三个参数写成了(int *)(sizeof(addr_conn)),所以不会报错但是取不到正确结果!!! //com_Sock = accept(m_hServerSocket,(SOCKADDR *)&addr_conn,&nSize); //or getpeername(com_Sock,(SOCKADDR *)&addr_conn,&nSize); char szPeerAddress[16]; //Sets buffers to a specified character. memset((void *)szPeerAddress,0,sizeof(szPeerAddress)); cout << szPeerAddress << "**************" <<endl; //If no error occurs, inet_ntoa returns a character pointer to a static buffer //containing the text address in standard ".'' notation strcpy(szPeerAddress,inet_ntoa(addr_conn.sin_addr)); //Copy a string.the second parameter strSource Null-terminated source string cout << szPeerAddress << endl; //so remember that every time use the inet_ntoa, you must copy the result by yourself //or it will be covered by the other value addr_conn.sin_addr.S_un.S_addr = inet_addr("192.168.111.2"); cout << inet_ntoa(addr_conn.sin_addr) << endl; cout << endl; }
另外还有一个getsockname函数,区别在于:
getsockname()函数用于获取一个套接口的名字。它用于一个已捆绑或已连接套接口s,本地地址将被返回。本调用特别适用于如下情况:未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。
若一个套接口与INADDR_ANY捆绑,也就是说该套接口可以用任意主机的地址,此时除非调用connect()或accept()来连接,否则getsockname()将不会返回主机IP地址的任何信息。除非套接口被连接,WINDOWS套接口应用程序不应假设IP地址会从INADDR_ANY变成其他地址。这是因为对于多个主机环境下,除非套接口被连接,否则该套接口所用的IP地址是不可知的。
相关推荐
4. **Win32 API中的套接字函数**:除了上述的函数,还有其他辅助函数,如`getsockname()`获取Socket的本地地址,`getpeername()`获取远程连接的地址,以及`closesocket()`关闭Socket。 5. **错误处理**:在Socket...
- **`getpeername()`**:获取连接的对端Socket地址。 - **`gethostname()`**:获取本地主机名。 - **DNS解析**:将域名转换为IP地址,反之亦然,例如将"whitehouse.gov"解析为"63.161.169.137"。 #### 五、客户端-...
1. **accept()**:用于接受来自客户端的连接请求,返回一个新的Socket,该Socket将用于与客户端进行数据通信。 2. **bind()**:将Socket绑定到特定的IP地址和端口号,以便监听来自网络的连接。 3. **closesocket()**...
在这个例子中,`socket_getpeername()`函数用于获取与socket连接的远程主机名和端口,即客户端的IP地址。 总结来说,获取IP地址在PHP中可以通过`$_SERVER`全局数组或者Socket通信实现。前者适用于大多数Web应用,后...
服务器解析这些数据后,可以获取客户端的IP地址(通常是通过Socket对象的getpeername函数)。 4. 返回IP:服务器将客户端的IP地址打包成字符串形式,然后通过新的Socket回送给客户端。 5. 关闭连接:在完成交互后,...
- `gethostbyaddr()` 和 `gethostbyname()`:通过IP地址或名称获取主机信息。 - `getprotobyname()` 和 `getprotobynumber()`:通过名称或数字获取协议信息。 - `getservbyname()` 和 `getservbyport()`:通过...
此外,还有其他高级功能,如`getsockopt()`和`setsockopt()`用于获取和设置Socket选项,`getpeername()`和`getsockname()`用于获取远程或本地Socket的信息,`select()`或`poll()`用于多路复用I/O,监控多个Socket的...
在SocketTest中,可能会用到如`CreateThread`来创建并发的客户端或服务器线程,`Sleep`来控制线程等待,`GetSockName`和`GetPeerName`获取Socket的本地和远程地址信息,以及错误处理函数如`WSAGetLastError`等。...
9. 其他辅助函数包括getpeername()用于获取已连接的远程Socket的地址信息,gethostname()用于获取本地主机名。 Socket编程还涉及到网络字节序和主机字节序的概念。在进行数据传输时,需要确保数据在发送和接收时的...
Socket编程涉及到多种结构体,比如sockaddr用于存储IP地址和端口号信息,用于bind()、connect()、accept()等函数中。结构体的使用对于网络地址转换和数据处理是不可或缺的。 ### 本机转换 本机转换是指将网络字节...
此外,还有一些辅助函数,如`getpeername()`获取远程连接方的信息,`gethostname()`获取本地主机名,以及`gethostbyname()`和DNS服务用于解析域名到IP地址。 在实际编程中,通常会涉及到阻塞与非阻塞模式的选择,...
服务器程序使用`socket()`、`bind()`、`listen()`和`accept()`来创建并监听连接,而客户端程序使用`socket()`和`connect()`来发起连接请求。一旦连接建立,双方就可以通过`send()`和`recv()`进行数据交换。 此外,...
- **connect()函数**:在面向连接的Socket中,客户端使用connect()函数与服务器建立连接,并将本地和远程的地址信息存储在Socket数据结构中。 - **listen()函数**:仅适用于服务器端,设置Socket为监听模式,等待...
对于使用最多的 Internet 簇,其 Socket 地址主要包括两大部分:端口号、IP 地址。地址结构在 `<netinet/in.h>` 中定义。 Berkeley Socket 函数 ------------------- Berkeley Socket 函数是 Socket 编程的基础...
获取连接的对端(远程)的Socket信息。 16)`gethostname()`函数 获取本地主机名。 17)域名服务(DNS) DNS用于将人类可读的域名转换为IP地址,反之亦然,使用gethostbyname()和gethostbyaddr()等函数。 18)...
15. getpeername()函数:getpeername()函数是SOCKET编程中的一个重要函数,用于获取套接字的远程主机名。 16. gethostname()函数:gethostname()函数是SOCKET编程中的一个重要函数,用于获取本机的主机名。 17. ...
9. **getpeername()**:获取已连接Socket的远程地址信息。 10. **gethostname()**:获取本地主机名。 #### 八、域名服务(DNS) - **DNS**:域名系统,用于将域名解析为IP地址。 - **gethostbyname/gethostbyname2...
- **getpeername()**:获取已连接Socket的远程地址信息。 - **gethostname()**:获取本机的主机名。 #### 六、域名解析 - **DNS**:用于将域名转换为IP地址的过程称为域名解析。Linux系统提供了多种API来实现这一...
getpeername() 函数是用于获取远程主机的信息的函数。这一步骤对于 Socket 编程非常重要。 gethostname() 函数 gethostname() 函数是用于获取本地主机的信息的函数。这一步骤对于 Socket 编程非常重要。 域名服务...
10. `getpeername()`:获取与当前socket连接的远程对端的地址信息。 11. `gethostname()`:获取本地主机名。 12. `select()`:用于多路复用I/O,监控多个socket的活动状态,实现非阻塞I/O。 此外,你还需要掌握IP...