免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2962 | 回复: 5
打印 上一主题 下一主题

跪求-在线等-请吃饭-解决方法(Glade下实现网络通信) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-27 10:45 |只看该作者 |倒序浏览
我想实现两个textview窗口下的数据传输,想先在本机实验,网络通信使用线程处理。可是编译没有错,总是运行时显示段错误。
这只是我要做东西的很小一部分,这个调不通,没法继续啊,跪求大家一下。如果大家帮我解决了北京海淀区内的请吃饭,谢谢,下面是我的程序:
其中on_button1_clicked和on_button2_clicked是两个按键的响应函数,一个发送键一个接收键。


void
on_button1_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
int socket_send();
char *text,str1[1000];
text=str1;
GtkTextIter start, end;
pthread_t thrd1;
extern GtkTextBuffer *buffer2;
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer2),&start,&end);
const GtkTextIter s=start, e=end;
text=gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer2),&s,&e,FALSE);         //获取第一文本窗口的字符

//write into file    写入一文件中
FILE *f;
f=fopen("/mnt/log","w");        
rewind(f);
if(fwrite(text,sizeof(gchar),strlen(text),f)==0)
{
        g_print("no words transmit\n");
        }
rewind(f);
int rst=pthread_create(&thrd1,NULL,(void *)&socket_send,text);          //发起网络通信线程
if(rst!=0)
{
        g_print("pthread1 create failed\n");
        }
fclose(f);
}


void
on_button2_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
char *host_name="192.168.0.110";                                         //建立socket通信,接收数据
        int port=8000;
       
        char *buf,str3[100];
        buf=str3;
        int socket_descriptor;
        struct sockaddr_in pin;
        struct hostent *server_host_name;
               
        if((server_host_name=gethostbyname(host_name))==0)
        {
                g_print("Error resolving local host\n");
                exit(1);
                }
               
        bzero(&pin,sizeof(pin));
        pin.sin_family=AF_INET;
        pin.sin_addr.s_addr=htonl(INADDR_ANY);
        pin.sin_addr.s_addr=((struct in_addr *)(server_host_name->h_addr))->s_addr;
               
        pin.sin_port=htons(port);
       
        if(socket_descriptor=socket(AF_INET,SOCK_STREAM,0)==-1)
        {
                g_print("Error in socket funciton\n");
                exit(1);
                }
       
        if(connect(socket_descriptor,(void *)&pin,sizeof(pin))==-1)
        {
                g_print("Error in connect function\n");
                exit(1);
                }
       
        if(recv(socket_descriptor,buf,100,0)==-1)
        {
                g_print("Error in recv function\n");
                exit(1);
                }
        int s=strlen(buf);
        buf='\0';

extern GtkTextBuffer *buffer1;                                            //显示在另一个窗口上
GtkTextIter start, end;
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer1),&start,&end);
gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer1),&start,buf,s+1);

}

nt port=8000;
int socket_send(char *buf)
{
struct sockaddr_in sin;
struct sockaddr_in pin;
int sock_descriptor;
int temp_sock_descriptor;
int address_size;
int i,len;

sock_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(sock_descriptor==-1)
{
        g_print("socket function failed\n");
        exit(1);
        }
bzero(&sin,sizeof(sin));
        sin.sin_family=AF_INET;
        sin.sin_addr.s_addr=INADDR_ANY;
        sin.sin_port=htons(port);
       
if(bind(sock_descriptor,(struct sockaddr *)&sin,sizeof(sin))==-1)
{
        g_print("bind function failed\n");
        exit(1);
        }

if(listen(sock_descriptor,20)==-1)
{
        g_print("listen function failed\n");
        exit(1);
        }

while(1)
{
        temp_sock_descriptor=accept(sock_descriptor,(struct sockaddr *)&pin,&address_size);
        if(temp_sock_descriptor==-1)
        {
                g_print("accept function failed\n");
                exit(1);
                }
       
        len=strlen(buf);
       
        if(send(temp_sock_descriptor,buf,len,0)==-1)
        {
                g_print("send function failed\n");
                exit(1);
                }
        close(temp_sock_descriptor);
        }
       
}

[ 本帖最后由 buaazhangy 于 2007-11-27 10:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-11-27 11:15 |只看该作者
为什么有人看没人回啊~~请吃饭都没有回?我是说真的
这里面应该都是高手啊,这么小的程序不应该难倒大家滴~~

论坛徽章:
0
3 [报告]
发表于 2007-11-27 19:17 |只看该作者
求求各位路过的高手了~~~
拜托大家帮我一下好吗????我现在真的不知道怎么往下做了

论坛徽章:
0
4 [报告]
发表于 2007-11-27 21:37 |只看该作者
1、检查指针转换的相关语句,看有没有非法使用。
2、多线程中,socket要加锁。

论坛徽章:
0
5 [报告]
发表于 2007-11-27 22:40 |只看该作者

回复 #4 moyihua 的帖子

首先谢谢楼上的回答
但是不知道socket加锁概念,我去查查~~~

论坛徽章:
0
6 [报告]
发表于 2007-11-28 21:26 |只看该作者
关于 GTK+ 的多线程问题,请参考 GTK+ FAQ 的 5.2. Is GTK+ thread safe? How do I write multi-threaded GTK+ applications? [GTK 2.x] 一节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP