C++socket获取ip地址问题

#include "stdafx.h"
#include
#include
#include
#include
#include
#pragma comment(lib, "ws2_32.lib ") //linking to the library
using namespace std;

int main(int argc, char **argv) {

WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);//initiate the ws2_32.dll and match the version
if (err != 0)
{
    return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 ||   //if the version is not matched ,then quit and terminate the ws3_32.dll 
    HIBYTE(wsaData.wVersion) != 1)
{
    WSACleanup();
    return 0;
}
struct addrinfo *ailist, *aip;
struct addrinfo hint;
struct sockaddr_in6 *sinp6;
PHOSTENT hostinfo;
char *hostname;    //主机名   
char *port = "3294";                              //端口号 
const char *addr;
int ilRc;


if (argv[1] = NULL) {
    gethostname(hostname, sizeof(hostname));
}
else {
    hostname = argv[1];
}
if ((hostinfo = gethostbyname(hostname)) == NULL)    //获得本地ipv4地址
{
    errno = GetLastError();
    fprintf(stderr, "gethostbyname Error:%d\n", errno);
    return 1;
}
LPCSTR ip;
while (*(hostinfo->h_addr_list) != NULL)        //输出ipv4地址
{
    ip = inet_ntoa(*(struct in_addr *) *hostinfo->h_addr_list);
    printf("ipv4 addr = %s\n\n", ip);
    hostinfo->h_addr_list++;
}

hint.ai_family = AF_INET6;                 
hint.ai_socktype = SOCK_STREAM;     
hint.ai_flags = AI_PASSIVE;                   
hint.ai_protocol = 0;                              
hint.ai_addrlen = 0;                                
hint.ai_canonname = NULL;
hint.ai_addr = NULL;
hint.ai_next = NULL;
ilRc = getaddrinfo(hostname, port, &hint, &ailist);   
if (ilRc < 0)
{
    char str_error[100];
    strcpy(str_error, (char *)gai_strerror(errno));
    printf("str_error = %s", str_error);
    return 0;
}
if (ailist == NULL)
{
    printf("sorry not find the IP address,please try again \n");
}
for (aip = ailist; aip != NULL; aip = aip->ai_next)                         
{
    aip->ai_family = AF_INET6;
    sinp6 = (struct sockaddr_in6 *)aip->ai_addr;                                  
    int i;
    printf("ipv6 addr = ");
    for (i = 0; i < 16; i++)
    {
        if (((i - 1) % 2) && (i>0))
        {
            printf(":");
        }
        printf("%02x", sinp6->sin6_addr.u.Byte[i]);
    }
    printf(" \n");
    printf(" \n");
}


system("pause");
return 0;

}

代码如上,想实现的功能是从cmd进入后不输入参数输出本地ipv4 ipv6地址,输入域名可以输出指定域名的ipv4 ipv6地址

但是调试结果ipv6显示出错,全0,指定域名后也只会输出主机的地址,求各位大神看看,谢了

2个回答

if (argv[1] = NULL)少了个=
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。


写远控时用到的:
 
 
    SOCKADDR_IN addrIp;
    int addrIpsize=sizeof(addrIp);
    getpeername(clinet,(SOCKADDR*)&addrIp,&addrIpsize);
 
    char ipadd[20];
    strcpy_s(ipadd,inet_ntoa(addrIp.sin_addr));
 ......
答案就在这里:通过socket获取ip地址
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++socket获取ip地址问题

#include "stdafx.h" #include <Winsock2.h> #include <stdio.h> #include <iostream> #include <cstring> #include<ws2tcpip.h> #pragma comment(lib, "ws2_32.lib ") //linking to the library using namespace std; int main(int argc, char **argv) { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1, 1); err = WSAStartup(wVersionRequested, &wsaData);//initiate the ws2_32.dll and match the version if (err != 0) { return 0; } if (LOBYTE(wsaData.wVersion) != 1 || //if the version is not matched ,then quit and terminate the ws3_32.dll HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return 0; } struct addrinfo *ailist, *aip; struct addrinfo hint; struct sockaddr_in6 *sinp6; PHOSTENT hostinfo; char *hostname; //主机名 char *port = "3294"; //端口号 const char *addr; int ilRc; if (argv[1] = NULL) { gethostname(hostname, sizeof(hostname)); } else { hostname = argv[1]; } if ((hostinfo = gethostbyname(hostname)) == NULL) //获得本地ipv4地址 { errno = GetLastError(); fprintf(stderr, "gethostbyname Error:%d\n", errno); return 1; } LPCSTR ip; while (*(hostinfo->h_addr_list) != NULL) //输出ipv4地址 { ip = inet_ntoa(*(struct in_addr *) *hostinfo->h_addr_list); printf("ipv4 addr = %s\n\n", ip); hostinfo->h_addr_list++; } hint.ai_family = AF_INET6; hint.ai_socktype = SOCK_STREAM; hint.ai_flags = AI_PASSIVE; hint.ai_protocol = 0; hint.ai_addrlen = 0; hint.ai_canonname = NULL; hint.ai_addr = NULL; hint.ai_next = NULL; ilRc = getaddrinfo(hostname, port, &hint, &ailist); if (ilRc < 0) { char str_error[100]; strcpy(str_error, (char *)gai_strerror(errno)); printf("str_error = %s", str_error); return 0; } if (ailist == NULL) { printf("sorry not find the IP address,please try again \n"); } for (aip = ailist; aip != NULL; aip = aip->ai_next) { aip->ai_family = AF_INET6; sinp6 = (struct sockaddr_in6 *)aip->ai_addr; int i; printf("ipv6 addr = "); for (i = 0; i < 16; i++) { if (((i - 1) % 2) && (i>0)) { printf(":"); } printf("%02x", sinp6->sin6_addr.u.Byte[i]); } printf(" \n"); printf(" \n"); } system("pause"); return 0; } 代码如上,想实现的功能是从cmd进入后不输入参数输出本地ipv4 ipv6地址,输入域名可以输出指定域名的ipv4 ipv6地址 但是调试结果ipv6显示出错,全0,指定域名后也只会输出主机的地址,求各位大神看看,谢了

C语言用IP地址通过socket获取网页内容(或者源代码)

![图片说明](https://img-ask.csdn.net/upload/201906/21/1561112178_881727.png) 百度有通过域名获取的,但是没有通过ip获取啊 求大神啊!!!!!!!!!!!!!!!!!!!!!!!!!!!

在校大学生求各位大佬,C++socket bind绑定ip地址失败,错误码10038,怎么解决?

#include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #pragma comment(lib,"WS2_32.lib") #define BUFFER_MAX 2048 #define IP_HDRINCL 2 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) using namespace std; int main(){ SOCKET sock; int n_read,proto; int flag = 1; char buffer[BUFFER_MAX]; char LocalName[256]; char *ethhead,*iphead,*tcphead,*udphead,*icmphead,*p; WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { printf("WSAStartup ERROR.\\n"); //如果初始化WSADATA结构得到错误码,则显示出错信息 return -1; } // if(sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)<0){ // cout<<"Socket创建失败"<<endl; // exit(0); // } // setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)); //设置 IP 头操作选项 ////////////////////////创建并设置原始套接字 sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);//启用winsock创建原始套接字,SOCK_RAW 类型表示原始套接字类型混杂模式,也就是接收所有包 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));//设置原始套接字,设置 IP 头操作选项 ////////////////////////把原始套接字绑定到本地主机网卡上,实现将本地网卡置于混杂模式 if(gethostname((char*)LocalName, sizeof(LocalName)-1)!=0) //获取本地主机IP { printf("获取主机名失败 Error:%d.\\n",WSAGetLastError()); return -1; } gethostname((char*)LocalName, 256);//把本地主机名存放入指定的缓冲区中 hostent *pHost = gethostbyname((char*)LocalName); SOCKADDR_IN addr_in; //获取本地 IP 地址 addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(40000); if(bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in))!=0) //把原始套接字绑定在本地主机网卡上 { printf("绑定失败:%d.\\n",WSAGetLastError()); //绑定失败时显示提示信息 return -1; } //////////////////////////设置原始套接字能够接受所有的数据 DWORD dwValue = 1; if(ioctlsocket(sock, SIO_RCVALL, &dwValue)!=0) { printf("ioctlsocket Error:%d.\\n",WSAGetLastError()); //设置失败时显示提示信息 return -1; } while(true){ int ret = recv(sock,buffer,BUFFER_MAX,0); if(ret>0){ ethhead = buffer; p = ethhead; int n = 0XFF; //链路层前6+6+2个字节为目的MAC 源MAC type // printf("MAC: %.2X:%-02X-%.02X-%.02X-%.02X-%.02X ==> %.2X-%.2X-%.2X-%.2X-%.2X-%.2X-\n",p[6]&n,p[7]&n,p[8]&n,p[9]&n,p[10]&n,p[11]&n, // p[0]&n,p[1]&n,p[2]&n,p[3]&n,p[4]&n,p[5]&n); iphead = ethhead;// + 14; p = iphead + 12; //数据包前14个字节后为20字节的第九个字节为协议,第12-16,17-20个字节为源IP,目的IP printf("IP: %d.%d.%d.%d ==> %d.%d.%d.%d\n",p[0]&0XFF,p[1]&0XFF,p[2]&0XFF,p[3]&0XFF,p[4]&0XFF,p[5]&0XFF,p[6]&0XFF,p[7]&0XFF); short length = (short)(iphead+2)[0]; printf("总长度:%d\n",length); proto = (iphead+9)[0]; p = iphead + 20; printf("Protocol:"); switch(proto){ case 1: printf("ICMP\n");break; case 2: printf("IGMP\n");break; case 4: printf("IP\n");break; case 6: printf("TCP\n");break; case 8: printf("EGP\n");break; case 9: printf("IGP\n");break; case 17: printf("UDP\n");break; case 41: printf("IPv6\n");break; case 50: printf("ESP\n");break; case 89: printf("OSPF\n");break; default: printf("不知道,协议编号是%d,请自己查文档\n",proto);break; } } cout<<endl; Sleep(200); } } ``` ```

怎么得到本机ip地址,用c++

怎么得到本机ip地址,用c++实现,我想这个网络连接,使客户端可以自己获得ip地址。

客户端和服务端通过建立socket通信,协议是tcp/ip

有一个问题咨询:一个客户端和一个服务端通过tcp/ip连接(之间建立socket通信),在不断网的情况下,服务端关闭,客户端报警,重新开启服务器,客户端能够重新连接上服务端,但是如果拔掉网线,客户端就连接不上服务端了,但从服务端发送过来的数据还是可以读到,可是从客户端发送的数据不能到达服务端,这是为什么???

android socket通信(使用IPv6地址)失败

iPhone手机创建热点,Android手机连接该热点,获取iPhone设备的IPv6地址后,建立socket连接提示连接被拒绝或连接超时,代码中使用ping6 IP地址:端口号是可以成功的 ping6 fe80::c99:12f:f1cd:362a%wlan0:6804 可以成功 new Socket().connect(new InetSocketAddress("fe80::c99:12f:f1cd:362a%wlan0", 6804),3000); 提示连接被拒绝或连接超时 ps:如果两台设备连接同一个WiFi,则socket通信没问题

用raw socket 发送和接收arp包问题(已快疯,全部C币了,求帮忙!)

问题背景:假设本机ip设为172.29.26.1。自己这有一个cpu,内存到外设的软件仿真环境,有基本的网卡功能,上面跑一个elf格式linux内核。将该仿真环境运行在本地机器上,仿真环境中运行linux内核,给linux内核设定网卡的ip地址为172.29.26.200,mac自定。发现26.200发送arp给本机,本机不回应;本机发送arp给26.200,26.200有arp应答但是本机不更新arp缓存表导致ping不通。 遂写两个小程序测试,发现具体: 比如源ip:172.29.26.200,目的ip(本机ip地址):172.29.26.1 用raw socket写arp发送和接收的程序,通过本地网卡发送arp包给本机ip地址。 接收的程序通过recv()接收不到本地的arp回应。 另一个程序源ip为本机ip地址:172.29.26.1,目的ip:172.29.26.200(本机运行着上面提到的elf格式linux内核) 用raw socket写arp发送和接收的程序,通过本地网卡发送arp包给26.200。 接收的程序通过recv()确实接收到26.200的arp应答包,tcpdump也收到了,但是本地linux并没有更新arp缓存表,仿佛给过滤掉了。 能跟发送和接收arp包都是通过本地网卡有关系么?哪位大牛能帮忙解释下原因?为什么本机都收到arp应答包了仍然获取不到26.200的mac地址?

C语言通过socket接受一个网页的子页信息啊????求大佬

#include<winSock2.h> #include <iostream> #pragma comment(lib,"ws2_32.lib") void main() { WSADATA data; //winsock版本2.2 int err = WSAStartup(MAKEWORD(2, 2), &data); if (err) return; //用域名获取对方主机名 char host[] = "www.dianping.com"; struct hostent* h = gethostbyname(host); if (h == NULL) return; ////IPV4 //if (h->h_addrtype != AF_INET) // return; struct in_addr ina; //解析IP memmove(&ina, h->h_addr, 4); LPSTR ipstr = inet_ntoa(ina); //Socket封装 struct sockaddr_in si; si.sin_family = AF_INET; si.sin_port = htons(80); //ipstr = (LPSTR)"120.78.150.62:80/wuqi/index.html"; si.sin_addr.S_un.S_addr = inet_addr(ipstr); int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); connect(sock, (SOCKADDR*)& si, sizeof(si)); if (sock == -1 || sock == -2) return; //发送请求 //char host[] = "120.78.150.62:80/wuqi/index.html"; char request[1024] = "GET /?st=1 HTTP/1.1\r\nHost:"; strcat_s(request, host); strcat_s(request, "\r\nConnection:Close\r\n\r\n"); int ret = send(sock, request, strlen(request), 0); //printf("%s\n",request); //获取网页内容 FILE * f = fopen("recieved.txt","w"); int isstart = 0; while (ret > 0) { const int bufsize = 1024; char* buf = (char*)calloc(bufsize, 1); ret = recv(sock, buf, bufsize - 1, 0); fprintf(f, "%s", buf); free(buf); } fclose(f); closesocket(sock); WSACleanup(); printf("读取网页内容成功,已保存在recieved.txt中"); printf("3秒后自动关闭"); Sleep(3000); return; } 就输入子页的域名地址就不知道为什么访问不了了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

C语言socket怎么获取子页的信息?????????

就第一页(即主页)可以获取到内容但是, 但是输入网页子页的地址ip就不行了![图片说明](https://img-ask.csdn.net/upload/201906/22/1561214603_528412.jpg)

开发一个C/S架构的程序,服务器没有固定IP,是否可以通过邮箱的形式获取服务器的IP?

情况是这样的,服务器没有申请固定IP,客户端程序要通过socket访问服务器。 服务器每隔一段时间把自己的IP发送到一个固定邮箱,客户端程序通过访问这个邮箱获取服务器IP,然后通过这个IP和服务器通讯?

LinuxC gethostbyname获得本机IP 结果全是127.0.0.1

/* Linux C gethostbyname获得本机IP 结果全是127.0.0.1,没有获得固定的IP, linux主机有固定IP,这个怎么解决*/ char hostname[1024]={0}; struct hostent*ent=NULL; char**ip=NULL; if(0!=gethostname(hostname,sizeof(hostname))) { perror(""); return -1; } if(NULL==(ent=gethostbyname(hostname))) { perror(""); return -1; } for(ip=ent->h_addr_list;*ip!=NULL;ip++) { printf("%s\n",inet_ntoa(*(struct in_addr*)*ip)); }

C++ socket端口复用的问题

环境 公网服务器1台,内网服务器若干。其中一台内网可以和公网连接通信,打算在公网上用socket做端口转发来实现访各台问内网的目的。功能已经实现了(一对一连接),但端口复用问题一直很困惑,请各位帮忙检查一下代码,谢谢 公网代码 ``` // 绑定两个服务器socket void bind2bind(int port1, int port2) { char msgbuf[100]; memset(msgbuf, 0, 100); sprintf(msgbuf, "[+] 服务器初始化...\r\n"); outprint(msgbuf, strlen(msgbuf)); int fd0, fd1, fd2; if ((fd0 = create_socket()) == 0) return; if ((fd1 = create_socket()) == 0) return; if ((fd2 = create_socket()) == 0) return; int port0 = 5501; if (create_server(fd0, port0) == 0) { closesocket(fd0); return; } sprintf(msgbuf, "[+] 成功监听通信端口: %d\r\n", port0); outprint(msgbuf, strlen(msgbuf)); // 创建第一个服务器 if (create_server(fd1, port1) == 0) { closesocket(fd1); return; } sprintf(msgbuf, "[+] 成功监听隧道端口: %d\r\n", port1); outprint(msgbuf, strlen(msgbuf)); // 创建第二个服务器 if (create_server(fd2, port2) == 0) { closesocket(fd2); return; } sprintf(msgbuf, "[+] 成功监听上线端口: %d\r\n", port2); outprint(msgbuf, strlen(msgbuf)); // 等待两端上线 while (1) { sprintf(msgbuf, "[%d] 正在建立通信端口: %d\r\n", idx, port0); outprint(msgbuf, strlen(msgbuf)); struct sockaddr_in client0; int size0 = sizeof(struct sockaddr); int sockfd0 = accept(fd0, (struct sockaddr *)&client0, &size0); sprintf(msgbuf, "[%d] 通信端口连接成功 IP地址: %s\r\n", idx, inet_ntoa(client0.sin_addr)); outprint(msgbuf, strlen(msgbuf)); sprintf(msgbuf, "[%d] 发送idx值: %d\r\n", idx, idx); outprint(msgbuf, strlen(msgbuf)); char idxbuf[10]; memset(idxbuf, 0, 10); sprintf(idxbuf, "%d", idx); int send0 = send(sockfd0, idxbuf, strlen(idxbuf)+1, 0); if (send0 <= 0) { closesocket(sockfd0); continue; } closesocket(sockfd0); sprintf(msgbuf, "[%d] 正在建立隧道端口: %d\r\n", idx, port1); outprint(msgbuf, strlen(msgbuf)); struct sockaddr_in client1; int size1 = sizeof(struct sockaddr); int sockfd1 = accept(fd1, (struct sockaddr *)&client1, &size1); sprintf(msgbuf, "[%d] 正在建立上线端口: %d\r\n", idx, port2); outprint(msgbuf, strlen(msgbuf)); struct sockaddr_in client2; int size2 = sizeof(struct sockaddr); int sockfd2 = accept(fd2, (struct sockaddr *)&client2, &size2); sprintf(msgbuf, "[%d] 通过上线端口连接成功 IP地址: %s\r\n", idx, inet_ntoa(client2.sin_addr)); outprint(msgbuf, strlen(msgbuf)); // socket transocket sock; sock.fd1 = sockfd1; sock.fd2 = sockfd2; sock.idx = idx; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)transmitdata, (LPVOID)&sock, 0, NULL); idx++; } } ``` ``` 负责通信的内网代码 { int port0 = 5501; char msgbuf[100]; memset(msgbuf, 0, 100); while (1) { int sockfd0; if ((sockfd0 = create_socket()) == 0) return 0; // 通过5501端口连接服务器 sprintf(msgbuf, "[+] 正在连接服务器 %s:%d\r\n", sConnectHost, port0); outprint(msgbuf, strlen(msgbuf)); if (client_connect(sockfd0, sConnectHost, port0) == 0) { closesocket(sockfd0); continue; } sprintf(msgbuf, "[+] 服务器连接成功\r\n"); outprint(msgbuf, strlen(msgbuf)); // 接收服务器idx值 char idxbuf[10]; memset(idxbuf, 0, 10); int read0 = recv(sockfd0, idxbuf, 10, 0); if (read0 > 0) { // 在线程内执行conn2conn int nIdx = atoi(idxbuf); tranconn2conn conn; conn.host1 = sConnectHost; conn.port1 = iConnectPort; conn.host2 = sTransmitHost; conn.port2 = iTransmitPort; conn.idx = nIdx; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)conn2conn, (LPVOID)&conn, 0, NULL); } } closeallfd(); } // 内网转发数据 void conn2conn(LPVOID data) { tranconn2conn *conn = (tranconn2conn *)data; char msgbuf[100]; memset(msgbuf, 0, 100); while (1) { int sockfd1, sockfd2; if ((sockfd1 = create_socket()) == 0) return; if ((sockfd2 = create_socket()) == 0) return; sprintf(msgbuf, "[%d] 正在连接服务器 %s:%d\r\n", conn->idx, conn->host1, conn->port1); outprint(msgbuf, strlen(msgbuf)); if (client_connect(sockfd1, conn->host1, conn->port1) == 0) { closesocket(sockfd1); closesocket(sockfd2); continue; } sprintf(msgbuf, "[%d] 服务器连接成功\r\n", conn->idx); outprint(msgbuf, strlen(msgbuf)); sprintf(msgbuf, "[%d] 正在连接内网 %s:%d\r\n", conn->idx, conn->host2, conn->port2); outprint(msgbuf, strlen(msgbuf)); if (client_connect(sockfd2, conn->host2, conn->port2) == 0) { closesocket(sockfd1); closesocket(sockfd2); continue; } sprintf(msgbuf, "[%d] 内网连接成功\r\n", conn->idx); outprint(msgbuf, strlen(msgbuf)); // socket transocket sock; sock.fd1 = sockfd1; sock.fd2 = sockfd2; sock.idx = conn->idx; transmitdata(&sock); } } ``` ``` 数据转发代码 // 服务器转发数据 void transmitdata(LPVOID data) { transocket *sock = (transocket *)data; // 准备采用select模型 fd_set readfd, writefd; char read_in1[MAXSIZE], send_out1[MAXSIZE]; char read_in2[MAXSIZE], send_out2[MAXSIZE]; struct sockaddr_in client1, client2; char host1[20], host2[20], msgbuf[100]; memset(host1, 0, 20); memset(host2, 0, 20); memset(msgbuf, 0, 100); int port1 = 0, port2 = 0; int structsize1 = sizeof(struct sockaddr); int structsize2 = sizeof(struct sockaddr); // 获取第一客户端信息 if (getpeername(sock->fd1, (struct sockaddr *)&client1, &structsize1) < 0) { strcpy(host1, "fd1"); } else { strcpy(host1, inet_ntoa(client1.sin_addr)); port1 = ntohs(client1.sin_port); } // 获取第二客户端信息 if (getpeername(sock->fd2, (struct sockaddr *)&client2, &structsize2) < 0) { strcpy(host2, "fd2"); } else { strcpy(host2, inet_ntoa(client2.sin_addr)); port2 = ntohs(client2.sin_port); } sprintf(msgbuf, "[%d] fd1: %d, fd2: %d\r\n", sock->idx, sock->fd1, sock->fd2); outprint(msgbuf, strlen(msgbuf)); // 输出两个客户端信息 sprintf(msgbuf, "[%d] 建立数据转发走向(%s:%d <-> %s:%d)\r\n", sock->idx, host1, port1, host2, port2); outprint(msgbuf, strlen(msgbuf)); // 最大检测数目 int maxfd = max(sock->fd1, sock->fd2) + 1; // 设置检测超时 struct timeval timeset; timeset.tv_sec = TIMEOUT; // 超时秒数 timeset.tv_usec = 0; // 超时微秒 // 位模式清零 memset(send_out1, 0, MAXSIZE); memset(send_out2, 0, MAXSIZE); // 可读长度 int totalread1 = 0, totalread2 = 0; while (1) { // 采用select异步模型 FD_ZERO(&readfd); FD_ZERO(&writefd); // 添加到fd集合 FD_SET(sock->fd1, &readfd); FD_SET(sock->fd1, &writefd); FD_SET(sock->fd2, &readfd); FD_SET(sock->fd2, &writefd); // 第一个参数会被系统忽略掉 int result = select(maxfd, &readfd, &writefd, NULL, &timeset); if ((result < 0) && (errno != EINTR)) { // 程序出错 sprintf(msgbuf, "[%d] Error: select函数出错\r\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); break; } else if (result == 0) { // 等待超时 sprintf(msgbuf, "[%d] Error: select函数等待超时\r\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); continue; } // fd1可读, 只要可读, 一次即可读取完整, 无需while循环 if (FD_ISSET(sock->fd1, &readfd) && totalread1 < MAXSIZE) { int read1 = recv(sock->fd1, read_in1, MAXSIZE - totalread1, 0); if (read1 == 0 || (read1 < 0 && errno != EINTR)) { sprintf(msgbuf, "[%d] Error: 读取fd1出错\r\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); break; } // 改变fd1的发送缓冲区和他的大小(接了就要发嘛) memcpy(send_out1 + totalread1, read_in1, read1); sprintf(msgbuf, "[%d] fd1成功在地址: %16s:%d上面读取%d字节\r\n", sock->idx, host1, port1, read1); outprint(msgbuf, strlen(msgbuf)); totalread1 += read1; memset(read_in1, 0, MAXSIZE); } // fd2可写 if (FD_ISSET(sock->fd2, &writefd)) { int err = 0; int sendcount1 = 0; // 发送的话可能一次发不完(数据包过大) while (totalread1 > 0) { int send1 = send(sock->fd2, send_out1+sendcount1, totalread1, 0); if (send1 == 0 || (send1 < 0 && errno != EINTR)) { sprintf(msgbuf, "[%d] Error: 写入fd2出错\r\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); err = 1; break; } if ((send1 < 0) && (errno == ENOSPC)) break; // 改变缓冲区大小 sendcount1 += send1; totalread1 -= send1; sprintf(msgbuf, "[%d] fd2成功在地址: %16s:%d上面发送%d字节\r\n", sock->idx, host2, port2, send1); outprint(msgbuf, strlen(msgbuf)); } // 检验出错 if (err == 1) break; // 如果发送了数据, 并且没有发送干净 if ((totalread1 > 0) && (sendcount1 > 0)) { // 理论上下面两行永远不会执行 memcpy(send_out1, send_out1 + sendcount1, totalread1); memset(send_out1 + totalread1, 0, MAXSIZE - totalread1); } else { memset(send_out1, 0, MAXSIZE); } } // fd2可读, 只要可读, 一次即可读取完整, 无需while循环 if (FD_ISSET(sock->fd2, &readfd) && totalread2 < MAXSIZE) { int read2 = recv(sock->fd2, read_in2, MAXSIZE - totalread2, 0); if (read2 == 0 || (read2 < 0 && errno != EINTR)) { sprintf(msgbuf, "[%d] Error: 读取fd2出错\r\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); break; } // 接了就立即发出去 memcpy(send_out2 + totalread2, read_in2, read2); sprintf(msgbuf, "[%d] fd2成功在地址: %16s:%d上面读取%d字节\r\n", sock->idx, host2, port2, read2); outprint(msgbuf, strlen(msgbuf)); totalread2 += read2; memset(read_in2, 0, MAXSIZE); } // fd1可写 if (FD_ISSET(sock->fd1, &writefd)) { int err2 = 0; int sendcount2 = 0; while (totalread2 > 0) { int send2 = send(sock->fd1, send_out2 + sendcount2, totalread2, 0); if (send2 == 0 || (send2 < 0 && errno != EINTR)) { sprintf(msgbuf, "[%d] Error: 写入fd1出错\r\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); err2 = 1; break; } if ((send2 < 0) && (errno == ENOSPC)) break; sendcount2 += send2; totalread2 -= send2; sprintf(msgbuf, "[%d] fd1成功在地址: %16s:%d上面发送%d字节\r\n", sock->idx, host1, port1, send2); outprint(msgbuf, strlen(msgbuf)); } if (err2 == 1) break; if ((totalread2 > 0) && (sendcount2 > 0)) { memcpy(send_out2, send_out2+sendcount2, totalread2); memset(send_out2 + totalread2, 0, MAXSIZE - totalread2); } else { memset(send_out2, 0, MAXSIZE); } } } // 关闭socket closesocket(sock->fd1); closesocket(sock->fd2); sprintf(msgbuf, "[%d] 成功关闭掉两个socket, fd1, fd2\r\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); sprintf(msgbuf, "[%d] 本次数据转发结束\r\n\n", sock->idx); outprint(msgbuf, strlen(msgbuf)); } ```

socket如何实现其中的发送回调函数和完成发送的代码功能

c#socket异步通信中的SendCallback类包含在静态类中如何实现其中的发送回调函数和完成发送的代码功能 以及错误如何解决![![图片说明](https://img-ask.csdn.net/upload/201509/16/1442378500_213820.jpg)图片说明](https://img-ask.csdn.net/upload/201509/16/1442378441_762401.jpg) using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Data; using System.Windows.Forms; using System.Threading; namespace DAL { /// <summary> /// Socket接口 /// </summary> static class socket { //Socket public static Socket clientSocket; /// <summary> /// socket连接 /// </summary> /// <returns> /// true 成功 /// false 失败 /// </returns> public static bool SocketConnect() { byte[] receive_buff = new byte[256]; ManualResetEvent connectDone = new ManualResetEvent(false); //连接的信号 ManualResetEvent readDone = new ManualResetEvent(false); //读信号 ManualResetEvent sendDone = new ManualResetEvent(false); //发送结束 //从配置文件获取IP string SocketIP = DAL.Common.ReadConfigString("Recover", "IP"); //从配置文件获取端口 int SocketPort = Convert.ToInt32(DAL.Common.ReadConfigString("Recover", "Port")); //创建IP地址 IPAddress IP = IPAddress.Parse(SocketIP); try { //创建socket实例 clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建网络端点 IPEndPoint ipEnd = new IPEndPoint(IP, SocketPort); //EndPoint ipEnd = (EndPoint)remotepoint; //与目标终端连接 clientSocket.BeginConnect(ipEnd, new AsyncCallback(ConnectCallback), clientSocket);//调用回调函数 connectDone.WaitOne(); if (clientSocket.Connected) { return true; } else { return false; } } catch (Exception e) { string strError = ""; strError += "\r\n SocketIP = " + SocketIP.ToString(); strError += "\r\n SocketPort = " + SocketPort.ToString(); DAL.Common.WriteErrorLog(e, strError); return false; } } public static void ConnectCallback(IAsyncResult ar) { bool connect_flag = false; ManualResetEvent connectDone = new ManualResetEvent(false); //连接的信号 Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); connect_flag = true; connectDone.Set(); } /// <summary> /// Socket发送数据 /// </summary> /// <param name="strSend"> /// 数据的内容 /// </param> public static void SocketSend(string strSend) { Socket tcpsend; //发送创建套接字 ManualResetEvent sendDone = new ManualResetEvent(false);//发送结束 int length = strSend.Length; Byte[] Bysend = new byte[length]; try { Bysend = System.Text.Encoding.Default.GetBytes(strSend); //将字符串指定到指定Byte数组 tcpsend.BeginSend(Bysend, 0, Bysend.Length, 0, new AsyncCallback(SendCallback), tcpsend); //异步发送数据 sendDone.WaitOne(); } catch (Exception e) { string strError = ""; DAL.Common.WriteErrorLog(e, strError); } } private void SendCallback(IAsyncResult ar) //发送的回调函数 { Socket client = (Socket)ar.AsyncState; int bytesSend = client.EndSend(ar); //完成发送 sendDone.Set(); }![图片说明](https://img-ask.csdn.net/upload/201509/16/1442378304_186857.jpg)

Linux下网络编程read,write问题(C语言),求大神指点阿!!!

zuijzuj。最近学习socket编程的时候调试代码出现了一些问题,求大神们指导阿!!!我要实现的功能是客户端输入两个操作数和一个运算符,在服务端进行运算再把结果返回到客户端。现在的bug是客户端输入第一个操作数的时候没问题,输入运算符的时候客户端可以通过write函数写入但是服务端读出的结果不是输入的运算符,客户端输入第二个操作数的时候write函数无法写入,这是缓冲区满了吗?缓冲区大小不是由内核自己决定的吗?还是write和read函数调用不当?请大神们指正!这个问题困扰了我好多天了! 以下是客户端和服务端的代码,末尾是运行结果的截图。 客户端: #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h> #include <string.h> #include <errno.h> int main() { int cfd; /* 文件描述符 */ int recbytes; int sin_size; char result[1024]={0}; /* 接受缓冲区 */ struct sockaddr_in s_add,c_add; /* 存储服务端和本端的ip、端口等信息结构体 */ unsigned short portnum=2015; /* 服务端使用的通信端口,可以更改,需和服务端相同 */ int opnum1,opnum2; char op[2]; char opnum1s[3],opnum2s[3],temp[3]; char mutex[3] = "111"; printf("Hello,welcome to client !\r\n"); /* 建立socket 使用因特网,TCP流传输 */ cfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == cfd) { printf("socket fail ! \r\n"); return -1; } printf("socket ok !\r\n"); /* 构造服务器端的ip和端口信息,具体结构体可以查资料 */ bzero(&s_add,sizeof(struct sockaddr_in)); s_add.sin_family=AF_INET; s_add.sin_addr.s_addr= inet_addr("192.168.1.104"); /* ip转换为4字节整形,使用时需要根据服务端ip进行更改 */ s_add.sin_port=htons(portnum); printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port); /* 这里打印出的是小端 和我们平时看到的是相反的。 */ /* 客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小 */ if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) { printf("connect fail !\r\n"); return -1; } printf("connect ok !\r\n"); /*连接成功*/ //write op and opnumbers to server //write opnumber1 printf("Please enter the first number:"); scanf("%d", &opnum1); itoa(opnum1, opnum1s, 10);//itoa if (-1 == write (cfd, opnum1s,strlen(opnum1s))) { printf("write first number fail!\n"); return 0; } //write op printf("Please enter the op('+','-','*','/'): "); scanf("%s", &op); if (-1 == write (cfd, op ,strlen(op))) { printf("write op fail!\n"); return 0; } //write opnumber2 printf("Please enter the second number:"); scanf("%d", &opnum2); itoa(opnum2, opnum2s, 10); if (-1 == write (cfd, opnum2, strlen(opnum2s))) { printf("write second number fail!\n"); return 0; } else { printf("All has been writed!\n"); } //从服务端接收字符*/ if(-1 == (recbytes = read(cfd,result,5))) { printf("read data fail !\r\n"); return -1; } else printf("read ok\r\nREC:\r\n"); result[recbytes]='\0'; printf("The result is %s\r\n",result); getchar(); /* 此句为使程序暂停在此处,可以使用netstat查看当前的连接 */ close(cfd); /* 关闭连接,本次通信完成 */ return 0; } void itoa(int i,char*string) { int power,j; j=i; for(power=1;j>=10;j/=10) power*=10; for(;power>0;power/=10) { *string++='0'+i/power; i%=power; } *string='\0'; } ``` 服务端: #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h> #include <string.h> int main() { int sfp,nfp; /* 定义两个描述符 */ struct sockaddr_in s_add,c_add; int sin_size; unsigned short portnum=2015; /* 服务端使用端口 */ int res, opnum1, opnum2, opnumi; int i = 1; int opnum[3]; char op[2],ress; char opnums[3],opnumis[3],opnum1s[3],opnum2s[3],temp[3]; printf("Hello,welcome to my server !\r\n"); sfp = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sfp) { printf("socket fail ! \r\n"); return -1; } printf("socket ok !\r\n"); /* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */ bzero(&s_add,sizeof(struct sockaddr_in)); s_add.sin_family=AF_INET; s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */ s_add.sin_port=htons(portnum); /* 使用bind进行绑定端口 */ if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) { printf("bind fail !\r\n"); return -1; } printf("bind ok !\r\n"); /* 开始监听相应的端口 */ if(-1 == listen(sfp,5)) { printf("listen fail !\r\n"); return -1; } printf("listen ok!\r\n"); while(1) { sin_size = sizeof(struct sockaddr_in); /* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处, 不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。 此处accept的第二个参数用于获取客户端的端口和地址信息。 */ nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size); if(-1 == nfp) { printf("accept fail !\r\n"); return -1; } printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port)); //read from client while (i <= 4) { if (4 == i) { switch (op[1]) { case '+': res = opnum[1] + opnum[3];break; case '-': res = opnum[1] - opnum[3];break; case '*':res = opnum[1] * opnum[3];break; case '/': res = opnum[1] / opnum[3];break; default : printf("op error!\n"); } itoa(res, ress, 10); if(-1 == write(nfp,ress,strlen(ress))) { printf("write fail!\r\n"); return -1; } printf("write ok!\r\n"); } else { switch(i) { case 2: if ( -1 == read(nfp, op, 1)) { printf("read op fail!\n"); } printf("read op is:%d\n", op);break; case 1: case 3: if ( -1 == read(nfp, temp, 3)) { printf("read %d number fail!\n", i); } printf("read opnum%d is:%s\n", i ,temp); opnum[i] = atoi(temp);break; default : printf("error!\n"); } } i ++; } close(nfp); } close(sfp); return 0; } void itoa(int i,char*string) { int power,j; j=i; for(power=1;j>=10;j/=10) power*=10; for(;power>0;power/=10) { *string++='0'+i/power; i%=power; } *string='\0'; } ``` 客户端运行的情况: Hello,welcome to client ! socket ok ! s_addr = 0x6801a8c0 ,port : 0xdf07 connect ok ! Please enter the first number:123 Please enter the op('+','-','*','/'): + Please enter the second number:444 write second number fail! ![图片说明](https://img-ask.csdn.net/upload/201506/16/1434438899_561887.png) 服务端运行的情况: Hello,welcome to my server ! socket ok ! bind ok ! listen ok! accept ok! Server start get connect from 0xc0a80168 : 0xc42d read opnum1 is:123 read op is:-1074087721 read opnum3 is:123 op error! 段错误 (核心已转储) ![图片说明](https://img-ask.csdn.net/upload/201506/16/1434438921_326746.png)

如何获根据进程的PID取某个进程所建立的ip连接信息 ?

如何获取某个进程所建立的ip连接信息??/ 请问如何根据进程的PID,获取该进程所建立的IP连接信息,比如说进程test.exe建立了一个连接,目标ip是 246.153.789.80 : 69 可以通过该进程的PID获取到这个IP,以及远端端口 69 和本地端口吗? 环境: win-64 ,, VS2013 ,, C++

c++,socket编程实现简易聊天系统,客户端一直连不上服务端,connect返回错误10014

客户端 ``` //建立线程 DWORD WINAPI ConnectThreadFunc(LPVOID pParam) { //初始化 WSAData wsData; if (!AfxSocketInit(&wsData)) { AfxMessageBox(_T("Socket 库初始化出错!")); return false; } CMFCApplication1View *pChatClient = (CMFCApplication1View*)pParam; ASSERT(pChatClient != NULL); //新建一个socket pChatClient->ConnectSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET==pChatClient->ConnectSock ) { AfxMessageBox(_T("创建socket失败!")); return FALSE; } AfxMessageBox(_T("成功创建socket")); //获取端口 CString ServeIp; pChatClient->GetDlgItemText(IDC_SERVEID_INPUT, ServeIp); //取服务端的IP地址 int SPort = pChatClient->GetDlgItemInt(IDC_SERVEPORT_INPUT); //获取端口 if (SPort <= 0 || SPort > 65535) { AfxMessageBox(_T("请输入合法的端口:1-65535")); goto _End; } AfxMessageBox(_T("端口合法")); //将IP转换 char AddrIp[16] = { 0 }; //窄字节 USES_CONVERSION; strcpy_s(AddrIp, 16, T2A(ServeIp)); // T2A:宏,进行字符串的转换 //将服务器的信息放入通用套接字中 sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(SPort); server.sin_addr.s_addr = inet_addr("192.168.73.1"); //客户端连接服务端 //将server传给connect if ( SOCKET_ERROR == connect(pChatClient->ConnectSock, (struct sockaddr*)&server, sizeof(struct sockaddrr*)) ) { /* char ErrorInfo[256] = { 0 }; //创建数组存储错误信息 sprintf_s(ErrorInfo, "Creat Faile : %d", GetLastError()); //把错误信息写入数组 AfxMessageBox((CString)ErrorInfo); */ AfxMessageBox(_T("连接失败!")); goto _End; } pChatClient->MsgShow(_T("服务器连接成功!")); while (TRUE) { if (SOCKERT_Select(pChatClient->ConnectSock,100,TRUE)) { char szBuf[MAX_BUF_SIZE] = { '0' }; //缓冲区 int iRet = recv(pChatClient->ConnectSock, szBuf, MAX_BUF_SIZE, 0); //recv()用来接收远程主机通过套接字sockfd发送来的数据, //并把这些数据保存到数组buf中 if (iRet > 0) { pChatClient->MsgShow((CString)szBuf); } else { pChatClient->MsgShow(_T("连接异常,请重新连接!")); break; } } Sleep(100); } _End: closesocket(pChatClient->ConnectSock); return TRUE; } ``` 服务端 ``` SOCKET ComSock; //用于发送消息 //查看客户端是否发来消息,并快速返回 BOOL SOCKERT_Select(SOCKET Socket, int TimeOut, BOOL bRead) { fd_set fdset; //通知执行了select()的进程哪一socket或文件发生了可读或可写事件 //long类型的数组,每一个数组元素都能与一打开的文件句柄建立联系 timeval tv; //判断是否超时,用于select()函数 FD_ZERO(&fdset); //清空集合中所有的元素 FD_SET(Socket, &fdset); //设置hSocket,使集合包含hSocket,即建立联系 TimeOut = TimeOut > 1000 ? 1000 : TimeOut; tv.tv_sec = 0; //秒数 tv.tv_usec = TimeOut; //微秒数 int iRet = 0; if (bRead) { //select()测试指定的fd可读?可写?有异常条件待处理? //即对socket操作 iRet = select(0, &fdset, NULL, NULL, &tv); } //读 else { iRet = select(0, NULL, &fdset, NULL, &tv); } //写 if (iRet <= 0) { //返回错误时 return FALSE; } else if (FD_ISSET(Socket, &fdset)) {//返回处于就绪状态并且已经包含在fd_set结构中的描述字总数 return TRUE; } return FALSE; //返回零时(超时返回零) } //通过线程来开启服务器,因为accept是阻塞的 //线程函数 DWORD WINAPI LisenThreadFunc(LPVOID pParam) { //LPVOID :32位的无类型的指针,在使用的时候再强制转换成需要的类型 CMFCApplication1View *pChatClient = (CMFCApplication1View*)pParam; //强制转换 ASSERT(pChatClient != NULL); //保证指针不为空 //断言函数,表达式为假则退出程序,为真继续执行 //用socket函数创建一个socket,用于监听 //成功则返回一个socket pChatClient->ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (pChatClient->ListenSock == INVALID_SOCKET) { AfxMessageBox(_T("创建socket失败!")); return 0; } //绑定,将 ListenSock 绑定在本地的一个ip和端口上 //1、动态获取用户输入的端口 int Port = pChatClient->GetDlgItemInt(IDC_LISTENPORT_INPUT); if (Port <= 0 || Port > 65535) { AfxMessageBox(_T("请输入合适的端口:1-65535")); goto _End; } //2、建立通用套接字 sockaddr_in service; //一种通用的套接字地址。用来建立所需信息,最后使用类型转换 //一般用于bind、connect、recvfrom、sendto等函数的参数 service.sin_family = AF_INET; //协议族 service.sin_addr.s_addr = inet_addr("127.0.0.1"); //获取本机所有可能得到的ip地址 service.sin_port = htons(Port); //传递端口 //htons:将主机字节顺序转换为网络字节顺序 //3、利用bind进行绑定 if (bind(pChatClient->ListenSock, (sockaddr*)&service, sizeof(sockaddr_in)) == SOCKET_ERROR) { AfxMessageBox(_T("绑定失败!")); goto _End; } AfxMessageBox(_T("绑定成功!")); //监听 if (listen(pChatClient->ListenSock, 4) == SOCKET_ERROR) { AfxMessageBox(_T("监听失败!")); goto _End; } //服务器已搭建完毕,开始进行消息监测 while (TRUE) { if (SOCKERT_Select(pChatClient->ListenSock, 1000, TRUE)) {//若有消息 sockaddr_in ClientSocket; int len = sizeof(sockaddr_in); //返回客户端(即对方)的IP地址和端口 SOCKET ComSock = accept(pChatClient->ListenSock, (struct sockaddr*)&ClientSocket, &len); if (ComSock == INVALID_SOCKET) { //若没有收到信息 continue; } //当要进行信息交互时,再建一个新线程来进行信息交互 // CMFCApplication1View *ClientCopy; HANDLE iTtem; iTtem = CreateThread(NULL, 0, ClientThreadProc, pChatClient, CREATE_SUSPENDED, NULL); pChatClient->comThread = iTtem; ResumeThread(iTtem); //恢复线程的执行 } Sleep(100); } _End: closesocket(pChatClient->ListenSock); //强制关闭socket return TRUE; } ``` 由于最近刚学socket,实在不知道怎么改了,请各位大神帮我康康,谢谢大家!(呜呜呜我是新手么的c币)

用socket编写的客户端和服务端,客户端可以通过服务端的域名发送消息吗

本来要做GPRS通信模块发送命令到服务器端,服务器端根据命令做出反应,如果命令有需要还要返回数据到Gprs模块。网上搜怎么做,都是说用sokect做,我需要的是GPRS模块通过服务器的域名发送消息到服务端。

getsocketname取得的IP = 0

A、B两个客户端IP相同,client A与服务端S连接成功,能收发消息。这个时候,client B试图连接S(connect的IP跟端口都相同),服务端监听,B与S成功连接,Accept一个新的文件描述符,从该文件描述符中取得服务端的IP。client A则掉线,recv显示服务端关闭连接,接着A试图去连接S,连接失败,错误是超时,但是服务端能accept成功返回新的文件描述符,不过调用getsocketname,取得的IP = 0。请大神给出合理的解释。

F5转发源地址设置到了tcp option,java如何读取tcp option

F5转发源地址设置到了tcp option,java如何读取tcp option,原生socket ,netty框架,vertx框架等等都可以

udp获取发送端的发送端口

udp进行数据接收,怎样获取发送方的发送端口,用GetPeerName()函数不行啊!谢谢大家!

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

立方体线框模型透视投影 (计算机图形学实验)

计算机图形学实验 立方体线框模型透视投影 的可执行文件,亲测可运行,若需报告可以联系我,期待和各位交流

2019 AI开发者大会

2019 AI开发者大会

组成原理课程设计(实现机器数的真值还原等功能)

实现机器数的真值还原(定点小数)、定点小数的单符号位补码加减运算、定点小数的补码乘法运算和浮点数的加减运算。

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

MFC一站式终极全套课程包

该套餐共包含从C小白到C++到MFC的全部课程,整套学下来绝对成为一名C++大牛!!!

软件测试2小时入门

软件测试2小时入门

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

计算机图形学-球的光照模型课程设计

计算机图形学-球的光照模型,有代码完美运行,有课程设计书

Linux常用命令大全(非常全!!!)

Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考: 系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 d...

因为看了这些书,我大二就拿了华为Offer

四年了,四年,你知道大学这四年我怎么过的么?

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

fakeLocation13.5.1.zip

fakeLocation13.5.1 虚拟定位 ios13.5.1的最新驱动下载,iPhone/iPad免越狱虚拟定位工具Location-cleaned驱动已更新

UnityLicence

UnityLicence

Python可以这样学(第一季:Python内功修炼)

Python可以这样学(第一季:Python内功修炼)

Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

土豆浏览器

土豆浏览器可以用来看各种搞笑、电影、电视剧视频

【数据结构与算法综合实验】欢乐连连看(C++ & MFC)案例

这是武汉理工大学计算机学院数据结构与算法综合实验课程的第三次项目:欢乐连连看(C++ & MFC)迭代开发代码。运行环境:VS2017。已经实现功能:开始游戏、消子、判断胜负、提示、重排、计时、帮助。

php+mysql学生成绩管理系统

学生成绩管理系统,分三个模块:学生,教师和管理员。 管理员模块:负责学生、老师信息的增删改;发布课程信息的增删改,以便让学生选课;审核老师提交的学生成绩并且打印成绩存档;按照课号查询每个课号的学生成绩

多功能数字钟.zip

利用数字电子计数知识设计并制作的数字电子钟(含multisim仿真),该数字钟具有显示星期、24小时制时间、闹铃、整点报时、时间校准功能

推荐24个国外黄色网站欣赏

在中国清朝,明黄色的衣服只有皇子才有资格穿,慢慢的黄色在中国就成了高贵的颜色。在人们的色彩印象中,黄色也表现为暂停。所以当你的网页设计采用黄色的时候,会让人们在你的网页前停留。 黄色,就像橙色和红色,黄色也是一个暖色。它有大自然、阳光、春天的涵义,而且通常被认为是一个快乐和有希望的色彩。黄色是所有色相中最能发光的颜色,给人轻快,透明,辉煌,充满希望的色彩印象。 黄色是一个高可见的色...

u-boot-2015.07.tar.bz2

uboot-2015-07最新代码,喜欢的朋友请拿去

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

学生成绩管理系统(PHP + MYSQL)

做的是数据库课程设计,使用的php + MySQL,本来是黄金搭配也就没啥说的,推荐使用wamp服务器,里面有详细的使用说明,带有界面的啊!呵呵 不行的话,可以给我留言!

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

C++语言基础视频教程

C++语言基础视频教程

玩转Python-Python3基础入门

玩转Python-Python3基础入门

相关热词 c# 按行txt c#怎么扫条形码 c#打包html c# 实现刷新数据 c# 两个自定义控件重叠 c#浮点类型计算 c#.net 中文乱码 c# 时间排序 c# 必备书籍 c#异步网络通信
立即提问