标题:c#socket如何在客户端和服务器之间传送结构体型的数据?
只看楼主
lianjiecuowu
Rank: 3Rank: 3
来 自:安徽
等 级:论坛游侠
帖 子:152
专家分:107
注 册:2011-5-20
结帖率:85.71%
已结贴  问题点数:20 回复次数:7 
c#socket如何在客户端和服务器之间传送结构体型的数据?
我在做一个项目,其中涉及到c#网络编程中的通信,想要在客户端和服务器之间利用socket实现信息响应与应答,但是之前只是用socket传递过字符串型的数据,现在定义的是一个结构体,我想用socket面向连接的方式实现传送结构体,请各位大神帮忙指点一下,谢谢各位,是c#哦
搜索更多相关主题的帖子: 如何 字符串 结构体 socket 
2013-04-27 09:48
lxb932979339
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:84
专家分:313
注 册:2013-4-24
得分:5 
想了想,我觉得不能直接传递吧,你可以这样考虑下,结构体是值类型,而值类型在内存中分配的地址是不变的,基于这种想法,你可以考虑下传递内存地址,不过在C#中运用指针你要慎之又慎,另外我觉得可以利用数据库。。。。

[ 本帖最后由 lxb932979339 于 2013-4-27 11:35 编辑 ]
2013-04-27 10:13
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:5 
传送结构体啊!那你直接派生一个,或者传送对象

Maybe
2013-04-27 15:17
lxb932979339
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:84
专家分:313
注 册:2013-4-24
得分:0 
那具体 怎么传送呢,对象是存储在服务器或客户端的电脑的内存中,况且链路上传输的 只是 1 和0,你怎么把结构体转换成0,1  ,你这么说我真有点糊涂了。。。之前我没遇见过着事,要是真能传递,望指点下。。。
2013-04-27 18:36
lantian8134
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:8
帖 子:115
专家分:789
注 册:2013-1-11
得分:5 
客户端将对象序列化后传输,服务器端将接受到得对象进行反序列化。
反过来同样道理。
2013-04-27 19:48
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:5 
想多了反而复杂,能传字符串就OK啊,把数据取出来就行了嘛
就比如我有一件衣服,放在衣柜里了,现在我要把衣服拿到朋友家去,我不可能把衣柜一起搬过去吧,我打开衣柜把衣服拿出来,再拿过去就可以了
2013-04-27 20:05
lianjiecuowu
Rank: 3Rank: 3
来 自:安徽
等 级:论坛游侠
帖 子:152
专家分:107
注 册:2011-5-20
得分:0 
同志们,讨论的很热烈,但是没有我预期的回答,


客户端程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <signal.h>

struct test
{char        *t1;
char        *t2;
} cli;

int main()
{
        int        n, fd;
        struct        sockaddr_in        addr;
        FILE        *fp;
        char        ipbuf[256], portbuf[256], buf[256];

        fp = fopen("/etc/ip.ini", "r");
        fgets(ipbuf, sizeof(ipbuf), fp);
        fgets(portbuf, sizeof(portbuf), fp);
        fclose(fp);

        cli.t1 = "abc";
        cli.t2 = "def";
        addr.sin_family = AF_INET;
        addr.sin_port = atoi(portbuf);
        addr.sin_addr.s_addr = inet_addr(ipbuf);

        fd = socket(AF_INET, SOCK_STREAM, 0);
        connect(fd, (struct sockaddr *)&addr, sizeof(addr));
        send(fd, &cli, sizeof(cli), 0);
        //recv(fd, buf, sizeof(buf), 0);
        close(fd);
        exit(0);
}

服务端程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <netdb.h>

struct test
{char        *t1;
char        *t2;
}ser;

int main()
{
        int        serfd, clifd;
        int        n, serlen, clilen;
        struct        sockaddr_in        seraddr, cliaddr;
        FILE        *fp;
        char        ipbuf[256], portbuf[256], buf[25];
               
        fp = fopen("/etc/ip.ini", "r");
        fgets(ipbuf, sizeof(ipbuf), fp);
        fgets(portbuf, sizeof(portbuf), fp);
        fclose(fp);

        seraddr.sin_family = AF_INET;
        seraddr.sin_port = atoi(portbuf);
        seraddr.sin_addr.s_addr = inet_addr(ipbuf);
        
        serfd = socket(AF_INET, SOCK_STREAM, 0);
        bind(serfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
        
        listen(serfd, 10);
        signal(SIGCHLD, SIG_IGN);

        while(1){
                clilen = sizeof(cliaddr);
                clifd = accept(serfd, (struct sockaddr *)&cliaddr, &clilen);
                if(fork() == 0) {
                        close(serfd);
                        n = recv(clifd, &ser, sizeof(struct test), 0);
                        //fprintf(stderr, "%d", n);
                        fprintf(stderr, "%s", ser.t1);
                        close(clifd);
                        exit(0);
                }
                else
                        close(clifd);
        }
}
这是我在网上找的程序,但是不是c#的,大家可有灵感?

Sharp your mind!
2013-04-27 21:02
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
说实话,没有灵感,同一台机器传地址可以,不同的机器传地址不就挂了,还是得传数据
2013-04-27 23:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-405650-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024052 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved