免费注册 查看新帖 |

Chinaunix

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

求助,socket程序设计碰见问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-18 15:25 |只看该作者 |倒序浏览
需要写一个转发程序,从第1台主机端口1读取数据,处理后通过端口2转发至第2台主机,第2台主机处理后通过端口2返回,并通过端口1返回至第1台主机。
请高手帮助一下,

论坛徽章:
0
2 [报告]
发表于 2006-01-18 17:11 |只看该作者
这个问题并不复杂

在server1端写一个服务程序:

      sock1=accept();

         recv data from sock1;

         对接收到的数据进行处理(如有必要的话);

        sock2=socket();

        connect server2;

        send data to server2(sock2);

        recv data from server2(sock2);

        close( sock2 );

        对从server2接收到的返回数据进行处理(如必要);

       send data back to client by sock1;

        close( sock1 );

业务处理过程基本如此。以上过程省略了函数的参数细节。

论坛徽章:
0
3 [报告]
发表于 2006-01-18 19:31 |只看该作者
有意思!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-01-19 11:31 |只看该作者
直接用iptables写个NAT策略如何?这样更简洁.

论坛徽章:
0
5 [报告]
发表于 2006-01-19 11:58 |只看该作者
原帖由 mq110 于 2006-1-19 11:31 发表
直接用iptables写个NAT策略如何?这样更简洁.


有些应用不光是单纯的转发,还需要对数据做一些处理

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-01-19 11:59 |只看该作者
原帖由 sunlan 于 2006-1-19 11:58 发表


有些应用不光是单纯的转发,还需要对数据做一些处理


这样的话.就应当用 大哥您说的方法了.
只是不知道LZ是什么需求.所以简单的提了一句.

论坛徽章:
0
7 [报告]
发表于 2006-01-19 15:32 |只看该作者

我是按照sunlan 兄的说法作的

环境是unix,参考的是unix网络编程的一个例子,连接都能建立,顺利的执行到connect server2,建立连接后在send data to server2(sock2);时报文丢失了,我不明白为什么,后来我单独写了个测试的client能够顺利传送报文。
程序如下

#include                 "unp.h"

#define DEBUG                                                                  
#define BASPORT                                                            
#define LOCALPORT                                                           
#define LOCALADDR                                                
#define BASHOST         

int
bascom(char *sDATA, char *rDATA)
{
                int                                          sockfd;
                char                                       sndpkg[MAXLINE];
                char                                       rcvpkg[MAXLINE];
                struct sockaddr_in                 servaddr;
                struct sockaddr_in                 cliaddr;

                memset(sndpkg, '\0',sizeof(sndpkg));
                memset(rcvpkg, '\0',sizeof(rcvpkg));
                strncpy(sndpkg, sDATA,strlen(sDATA));
#ifdef DEBUG
               printf("sndpkg= [%s]\n",sockfd,sndpkg);
               /*sndpkg的内容存在*/
#nedif


                sockfd = Socket(AF_INET, SOCK_STREAM, 0);

                bzero(&servaddr, sizeof(servaddr));

                servaddr.sin_family = AF_INET;

                servaddr.sin_port = htons(BASPORT);

                Inet_pton(AF_INET, BASHOST, &servaddr.sin_addr);

                cliaddr.sin_family = AF_INET;
                                                                              
               cliaddr.sin_port   = htons(LOCALPORT);                                 
                                                                              
               Inet_pton(AF_INET,LOCALADDR, &cliaddr.sin_addr);                        
                                                                              
               Bind(sockfd, (SA *) &cliaddr, sizeof(cliaddr));   
   
               Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
#ifdef DEBUG
               printf("befor transfer,sockfd= [%d] sndpkg= [%s]\n",sockfd,sndpkg);
               /*此时,sndpkg的内容没了*/
#nedif
               while( NULL !=sndpkg)
               {
                    Writen(sockfd, sndpkg, strlen(sndpkg));                        
                                                                              
                    if (Readline(sockfd, rcvpkg, MAXLINE) == 0)                          
                                err_quit("cli read: server terminated prematurely");   
#ifdef DEBUG                                                                              
                 printf("rcvpkg=[%s]\n",rcvpkg);                                 
#nedif
                   Close(sockfd);
               }

                strncpy(rDATA, rcvpkg,strlen(rcvpkg));                              

#ifdef DEBUG                                                                    
                printf("COM's RDATA is [%s]\n", rDATA);                                
#endif           
                exit(0);
}

论坛徽章:
0
8 [报告]
发表于 2006-01-19 15:34 |只看该作者

请高手帮忙指点一下,比较急

因急用,请各位高手帮忙找一下原因

论坛徽章:
0
9 [报告]
发表于 2006-01-19 21:15 |只看该作者
在这个位置出错的唯一可能性就是内存越界,把数据冲掉了。仔细检查一下应该能查得到
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP