当前位置: 技术问答>linux和unix
急,向大家求助!结构体问题
来源: 互联网 发布时间:2016-03-28
本文导语: 问题是这样的,我要通过socket 使用tcp 向服务器端进程发送ip地址列表,ip地址是如“192.168.85.64”这样的字符串,我定义了一个结构体 sturct iplist { int ipnum ; // 表示有多少个ip ...
问题是这样的,我要通过socket 使用tcp 向服务器端进程发送ip地址列表,ip地址是如“192.168.85.64”这样的字符串,我定义了一个结构体
sturct iplist {
int ipnum ; // 表示有多少个ip
?? // 这个域就是要存放ipnum个ip地址的域,但我不知该如何定义这个域,来存放ipnum个ip地址,该怎么处理?
}
请大家给个思路,实现将多个如“192.168.85.64”这样的ip字符串,通过write()或其他的socket发送语句发送出去,在服务器端还能方便的将接收的ip提取出来。
或大家给个另外的方法实现上述功能。
有答案会及时结贴,谢谢大家
sturct iplist {
int ipnum ; // 表示有多少个ip
?? // 这个域就是要存放ipnum个ip地址的域,但我不知该如何定义这个域,来存放ipnum个ip地址,该怎么处理?
}
请大家给个思路,实现将多个如“192.168.85.64”这样的ip字符串,通过write()或其他的socket发送语句发送出去,在服务器端还能方便的将接收的ip提取出来。
或大家给个另外的方法实现上述功能。
有答案会及时结贴,谢谢大家
|
楼主的情况也是一个普遍的情况,即如何发送一个不定长的列表出去。我这暂有两种处理办法。
方法1:
发送端:找个特殊分隔符,然后拼接成串,发送时先发送整个串的字节数,然后再发送串。
接收端:按照发送顺序,先接收字节数域,再接收指定的字节数即可。
方法2(满足你用结构体的愿望):
// 数据结构定义
#define IP_LEN 4 // 一个IP的长度,v4的32位,v6的128位
struct iplist {
int iNumIP; // 列表个数,这里即是IP个数
char** pList; // 列表首地址,这里是IP列表首地址
};
----------------------------------
// 发送端数据存储如下
iplist iplst;
iplst.iNumIP = 2;
iplst.pList = (char*)malloc(IP_LEN*iplst.iNumIP);
memcpy(iplst.pList, "10.1.24.1");
memcpy(iplst.pList+IP_LEN, "10.x.y.z");
// 发送端发送
send(iplst.iNumIP, sizeof(int), ...);
send(iplst.pList, IP_LEN*iplst.iNumIP);
--------------------------------------------
// 接收端接收
iplist iplst;
recv(iplst.iNumIP, sizeof(int), ...)
iplst.pList = (char*)malloc(IP_LEN*iplst.iNumIP);
recv(iplst.pList, IP_LEN);
recv(iplst.pList+IP_LEN, IP_LEN);
PS:上面是伪代码,没有经过测试,不过思路应该说明白了吧。
方法1:
发送端:找个特殊分隔符,然后拼接成串,发送时先发送整个串的字节数,然后再发送串。
接收端:按照发送顺序,先接收字节数域,再接收指定的字节数即可。
方法2(满足你用结构体的愿望):
// 数据结构定义
#define IP_LEN 4 // 一个IP的长度,v4的32位,v6的128位
struct iplist {
int iNumIP; // 列表个数,这里即是IP个数
char** pList; // 列表首地址,这里是IP列表首地址
};
----------------------------------
// 发送端数据存储如下
iplist iplst;
iplst.iNumIP = 2;
iplst.pList = (char*)malloc(IP_LEN*iplst.iNumIP);
memcpy(iplst.pList, "10.1.24.1");
memcpy(iplst.pList+IP_LEN, "10.x.y.z");
// 发送端发送
send(iplst.iNumIP, sizeof(int), ...);
send(iplst.pList, IP_LEN*iplst.iNumIP);
--------------------------------------------
// 接收端接收
iplist iplst;
recv(iplst.iNumIP, sizeof(int), ...)
iplst.pList = (char*)malloc(IP_LEN*iplst.iNumIP);
recv(iplst.pList, IP_LEN);
recv(iplst.pList+IP_LEN, IP_LEN);
PS:上面是伪代码,没有经过测试,不过思路应该说明白了吧。
|
结构体声明:
sturct iplist{
int ipnum ; // 表示有多少个ip
char **ipaddr;// 这个域就是要存放ipnum个ip地址的域
}
定义变量:
struct iplist ip;
给结构体变量赋值:
ip.ipnum = 2;
ip.ipaddr = (char**)malloc(ip.ipnum*sizeof(char*));
if(ip.ipaddr == NULL)
{
printf("malloc error!n");
return -1;
}
for(i = 0;i
sturct iplist{
int ipnum ; // 表示有多少个ip
char **ipaddr;// 这个域就是要存放ipnum个ip地址的域
}
定义变量:
struct iplist ip;
给结构体变量赋值:
ip.ipnum = 2;
ip.ipaddr = (char**)malloc(ip.ipnum*sizeof(char*));
if(ip.ipaddr == NULL)
{
printf("malloc error!n");
return -1;
}
for(i = 0;i