红联Linux门户
Linux帮助

一个有关UNIX套接字的问题

发布时间:2007-04-24 15:32:56来源:红联作者:tiantianxian
各位大虾,小弟刚刚开始接触linux编程,现在要写一个进程间通信的程序,要求使用UNIX域套接字,并使用UDP机制,我有如下的思路,程序我也写了,但是接收部分总是不正常,如模块A收到消息为char from client B =5,可是实际应该是收到一个char型字符.请大家帮我看看我的程序,谢谢了.

实现思路:本程序是通过UDP协议来发送消息,消息的内容以及传递的地址是由main函数的参数来传递给进程的。参数示例如: AB5hello
每条消息的长短为8字节
消息的结构如下:
typedef struct
{
char self_module_id;//自己的ID,给每条消息贴上自己的标记,使接收方知道是谁发送过来的
char dst_module_id;//目的ID,决定每条消息发送的目的,通过此ID决定目的路径
int length;//消息长短
char msg[5];//消息内容
}msg_struct;
发送实现过程:1 通过对消息总长度(即main函数参数总长度)除8,判断有多少条完整的消息
2 通过调用一次sendto函数就发送一条消息,根据数据结构取得相应的目的地址来决定发送的路径,也就是每8个字节就判断一次,消息是发给哪个目的地址的。直到发完所有的完整的消息。
3 最后一条消息或许是不满8个字节的,通过对消息总长度取模,获得到这个不完整消息的长度,并发送这条消息。
读取实现过程:1 通过recvfrom获得全部的在描述符上的消息,并将其存入缓冲区rch
2 开始处理存入rch的消息,通过分包机制,把它重新打包成预先定义的消息结构体
3 先保存完整的消息,再保存不完整的消息。

程序代码如下
/*-------------------------------------------------------------------------
This is a client program
-------------------------------------------------------------------------*/
#include
#include
#include
#include
#include
#include
#include
#include
#define SIZE 32
#define MAXTEXT 256

int main(int argc,char **argv)
{
int src_sockfd;
int dst_sockfd;
int self_sockfd;
int n_read,n_write,len,rcd,i,o,k;
struct sockaddr_un src_sockaddr,dst_sockaddr,self_sockaddr;
//int result;
//char argv[1][MAXTEXT];
char rch[MAXTEXT];
//char dst_module_id;
char src_module_id;
//char self_module_id='A';
fd_set read_fd_set,write_fd_set ;
fd_set watchset ;
int maxfd;

typedef struct
{
char self_module_id;
char dst_module_id;
int length;
char msg[5];
}msg_struct;
msg_struct dst_msg;
dst_msg.self_module_id='A';
msg_struct src_msg;
char *ptr_rch,*ptr_sch;
msg_struct *ptr_rmsg,*ptr_smsg;
ptr_rmsg=&src_msg;
ptr_rch=rch;
ptr_smsg=&dst_msg;
ptr_sch=argv[1];

len=sizeof(src_sockaddr);

if(argc<2)
{
printf(" Aerror1 happen\n");
exit(1);
}


unlink("/home/wewe/code/temp/A");
self_sockfd=socket(AF_LOCAL,SOCK_DGRAM,0);
if(src_sockfd <0)
{
printf("sokcet err, %s \n", strerror(errno));
return -1;
}
bzero(&self_sockaddr,sizeof(self_sockaddr));
self_sockaddr.sun_family=AF_LOCAL;
strcpy(self_sockaddr.sun_path,"/home/wewe/code/temp/A");
bind(self_sockfd,(struct sockaddr*)&self_sockaddr,sizeof(self_sockaddr));



while(1)
//while(1)
{
FD_ZERO( &write_fd_set) ;//清除watchset结构体
FD_SET( self_sockfd, &write_fd_set) ;//将sever_sockfd加入到watchset中?
FD_ZERO(&read_fd_set);
FD_SET(self_sockfd,&read_fd_set);
maxfd=self_sockfd;


if(rcd = select( maxfd+1, &read_fd_set,&write_fd_set, NULL, (struct timeval *)0 )>0)
{

if (FD_ISSET( self_sockfd, &read_fd_set ))
{
printf("nengduA\n");
bzero(&src_sockaddr,len);
src_sockaddr.sun_family=AF_LOCAL;
//recvfrom(self_sockfd,&src_module_id,1,0,(struct sockaddr*)&src_sockaddr,&len);

n_read=recvfrom(self_sockfd,rch,10,0,(struct sockaddr*)&src_sockaddr,&len);
rch[n_read]=0;
for(i=0;i {
ptr_rmsg->self_module_id=rch[8*i+0];
ptr_rmsg->dst_module_id=rch[8*i+1];
ptr_rmsg->length=rch[8*i+2];
ptr_rmsg->msg[0]=rch[8*i+3];
ptr_rmsg->msg[1]=rch[8*i+4];
ptr_rmsg->msg[2]=rch[8*i+5];
ptr_rmsg->msg[3]=rch[8*i+6];
ptr_rmsg->msg[4]=rch[8*i+7];
printf("ClientA::char from Client %c =%c%c%c%c%c\n",ptr_rmsg->self_module_id,ptr_rmsg->msg[0],ptr_rmsg->msg[1],ptr_rmsg->msg[2],ptr_rmsg->msg[3],ptr_rmsg->msg[4]);

}
o=n_read%8;
if(o==4)
{
ptr_rmsg->self_module_id=rch[8*i+0];
ptr_rmsg->dst_module_id=rch[8*i+1];
ptr_rmsg->length=rch[8*i+2];
ptr_rmsg->msg[0]=rch[8*i+3];
printf("ClientA::char from Client %c =%c\n",ptr_rmsg->self_module_id,ptr_rmsg->msg[0]);
}
else if(o==5)
{
ptr_rmsg->self_module_id=rch[8*i+0];
ptr_rmsg->dst_module_id=rch[8*i+1];
ptr_rmsg->length=rch[8*i+2];
ptr_rmsg->msg[0]=rch[8*i+3];
ptr_rmsg->msg[1]=rch[8*i+4];
printf("ClientA::char from Client %c =%c%c\n",ptr_rmsg->self_module_id,ptr_rmsg->msg[0],ptr_rmsg->msg[1]);
}
else if(o==6)
{
ptr_rmsg->self_module_id=rch[8*i+0];
ptr_rmsg->dst_module_id=rch[8*i+1];
ptr_rmsg->length=rch[8*i+2];
ptr_rmsg->msg[0]=rch[8*i+3];
ptr_rmsg->msg[1]=rch[8*i+4];
ptr_rmsg->msg[2]=rch[8*i+5];
printf("ClientA::char from Client %c =%c%c%c\n",ptr_rmsg->self_module_id,ptr_rmsg->msg[0],ptr_rmsg->msg[1],ptr_rmsg->msg[2]);
}
else if(o==7)
{
ptr_rmsg->self_module_id=rch[8*i+0];
ptr_rmsg->dst_module_id=rch[8*i+1];
ptr_rmsg->length=rch[8*i+2];
ptr_rmsg->msg[0]=rch[8*i+3];
ptr_rmsg->msg[1]=rch[8*i+4];
ptr_rmsg->msg[2]=rch[8*i+5];
ptr_rmsg->msg[3]=rch[8*i+6];
printf("ClientA::char from Client %c =%c%c%c%c\n",ptr_rmsg->self_module_id,ptr_rmsg->msg[0],ptr_rmsg->msg[1],ptr_rmsg->msg[2],ptr_rmsg->msg[3]);
}
else
printf("recevie nothing\n");




sleep(3);
//printf("nengdu2\r\n");

}

if ( FD_ISSET( self_sockfd, &write_fd_set ) )
{ printf("nengxieA\n");

bzero(&dst_sockaddr,len);
dst_sockaddr.sun_family=AF_LOCAL;
n_write=strlen(argv[1]);
for(k=0;k {
ptr_smsg->self_module_id=argv[1][8*k+0];
ptr_smsg->dst_module_id=argv[1][8*k+1];
ptr_smsg->length=argv[1][8*k+2];
ptr_smsg->msg[0]=argv[1][8*k+3];
ptr_smsg->msg[1]=argv[1][8*k+4];
ptr_smsg->msg[2]=argv[1][8*k+5];
ptr_smsg->msg[3]=argv[1][8*k+6];
ptr_smsg->msg[4]=argv[1][8*k+7];
if(ptr_smsg->dst_module_id=='B')
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/B");
else
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/C");
sendto(self_sockfd,ptr_smsg,8,0,(struct sockaddr*)&dst_sockaddr,len);
printf("ClientA:: char to Client %c=%c%c%c%c%c\n",ptr_smsg->dst_module_id,argv[1][8*k+3],argv[1][8*k+4],argv[1][8*k+5],argv[1][8*k+6],argv[1][8*k+7]);
}
o=n_write%8;//判断最好一条不完整消息有多少字节
if(o==4)
{
ptr_smsg->self_module_id=argv[1][8*k+0];
ptr_smsg->dst_module_id=argv[1][8*k+1];
ptr_smsg->length=argv[1][8*k+2];
ptr_smsg->msg[0]=argv[1][8*k+3];
ptr_smsg->msg[1]='0';
ptr_smsg->msg[2]='0';
ptr_smsg->msg[3]='0';
ptr_smsg->msg[4]='0';
if(ptr_smsg->dst_module_id=='B')
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/B");
else
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/C");
sendto(self_sockfd,ptr_smsg,4,0,(struct sockaddr*)&dst_sockaddr,len);
printf("ClientA:: char to Client %c=%c\n",ptr_smsg->dst_module_id,argv[1][8*k+3]);
}
else if(o==5)
{
ptr_smsg->self_module_id=argv[1][8*k+0];
ptr_smsg->dst_module_id=argv[1][8*k+1];
ptr_smsg->length=argv[1][8*k+2];
ptr_smsg->msg[0]=argv[1][8*k+3];
ptr_smsg->msg[1]=argv[1][8*k+4];
ptr_smsg->msg[2]='0';
ptr_smsg->msg[3]='0';
ptr_smsg->msg[4]='0';
if(ptr_smsg->dst_module_id=='B')
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/B");
else
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/C");
sendto(self_sockfd,ptr_smsg,5,0,(struct sockaddr*)&dst_sockaddr,len);
printf("ClientA:: char to Client %c=%c%c\n",ptr_smsg->dst_module_id,argv[1][8*k+3],argv[1][8*k+4]);
}
else if(o==6)
{
ptr_smsg->self_module_id=argv[1][8*k+0];
ptr_smsg->dst_module_id=argv[1][8*k+1];
ptr_smsg->length=argv[1][8*k+2];
ptr_smsg->msg[0]=argv[1][8*k+3];
ptr_smsg->msg[1]=argv[1][8*k+4];
ptr_smsg->msg[2]=argv[1][8*k+5];
ptr_smsg->msg[3]='0';
ptr_smsg->msg[4]='0';
if(ptr_smsg->dst_module_id=='B')
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/B");
else
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/C");
sendto(self_sockfd,ptr_smsg,6,0,(struct sockaddr*)&dst_sockaddr,len);
printf("ClientA:: char to Client %c=%c%c%c\n",ptr_smsg->dst_module_id,argv[1][8*k+3],argv[1][8*k+4],argv[1][8*k+5]);
}
else if(o==7)
{
ptr_smsg->self_module_id=argv[1][8*k+0];
ptr_smsg->dst_module_id=argv[1][8*k+1];
ptr_smsg->length=argv[1][8*k+2];
ptr_smsg->msg[0]=argv[1][8*k+3];
ptr_smsg->msg[1]=argv[1][8*k+4];
ptr_smsg->msg[2]=argv[1][8*k+5];
ptr_smsg->msg[3]=argv[1][8*k+6];
ptr_smsg->msg[4]='0';
if(ptr_smsg->dst_module_id=='B')
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/B");
else
strcpy(dst_sockaddr.sun_path,"/home/wewe/code/temp/C");
sendto(self_sockfd,ptr_smsg,7,0,(struct sockaddr*)&dst_sockaddr,len);
printf("ClientA:: char to Client %c=%c%c%c%c\n",ptr_smsg->dst_module_id,argv[1][8*k+3],argv[1][8*k+4],argv[1][8*k+5],argv[1][8*k+6]);
}
else
printf("send nothing\n");

sleep(3);

//printf("nengxie\r\n");
}



}

//continue;

}





}
文章评论

共有 46 条评论

  1. 211.205.15.* 于 2007-07-17 22:10:19发表:

    http://10b0ddac277cb3d7832940814f08d605-t.xkktxb.org 10b0ddac277cb3d7832940814f08d605 http://10b0ddac277cb3d7832940814f08d605-b1.xkktxb.org 10b0ddac277cb3d7832940814f08d605 http://10b0ddac277cb3d7832940814f08d605-b3.xkktxb.org 8d1f2bfe3cbc5359328d95464cab8b7c