关于UNIX套接字的问题

guicaixinni 2008-01-21 06:03:19
服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <errno.h>

int main(void)
{
struct sockaddr_un remote_addr;
int send_fd;
char *buf = "one world,one dream";
int t = 0;

memset(&remote_addr,0,sizeof(remote_addr));

if((send_fd = socket(AF_LOCAL,SOCK_DGRAM,0))!= -1)
{
remote_addr.sun_family = AF_LOCAL;
strcpy(remote_addr.sun_path, "/home/code/CLIENT");

chmod(remote_addr.sun_path, 0777);
if (unlink(remote_addr.sun_path) != 0)
{
perror("unlink");
}



if(t = (sendto(send_fd,buf,strlen(buf),MSG_DONTWAIT,
(struct sockaddr *)&remote_addr, sizeof(remote_addr)))!= -1)
{
printf("sendto : bytes = %d\n",t);
}
else
{
printf("sendto : error i = %d \n",i);
}
close(send_fd);
}
else
{
printf("failed\n");
}

return 0;

}

客户端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <errno.h>

int main(void)
{
struct sockaddr_un local_addr,remote_addr;
int recv_fd;
socklen_t fromlen = sizeof(struct sockaddr);

char buf[256] = {0};

memset(&local_addr,0,sizeof(local_addr));
memset(&remote_addr,0,sizeof(remote_addr));
fromlen = sizeof(remote_addr);

if((recv_fd = socket(AF_LOCAL,SOCK_DGRAM,0))!= -1)
{
local_addr.sun_family = AF_LOCAL;
strcpy(local_addr.sun_path, "/home/zhubo/code/3/CLIENT");

printf("create socket\n");
unlink(local_addr.sun_path);
/*remote_addr.sun_family = AF_LOCAL;
strcpy(remote_addr.sun_path,"/home/zhubo/code/3/CLIENT");*/
printf("link addr\n");
if (bind(recv_fd, (struct sockaddr *)&local_addr, sizeof(local_addr)) != -1)
{
chmod(local_addr.sun_path, 0777);
printf("bind addr\n");
if(recvfrom(recv_fd,buf,sizeof(buf),0,
(struct sockaddr *)&remote_addr, &fromlen)!= -1)
{
printf("path: %s\n", remote_addr.sun_path);
printf("buff: %s\n", buf);
}
}
close(recv_fd);
}
else
{
printf("failed\n");
}

return 0;

}



客户端可以正常工作,但是为什么服务器端怎么老是发送失败?
...全文
239 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lif2000 2008-01-23
  • 打赏
  • 举报
回复
本地套接字,没有用过但是为什么服务器和客户端的sun_path不一样呢?
laopang 2008-01-23
  • 打赏
  • 举报
回复
Unix网络编程I 第八章的例子:

客户端:

/*
* Laopang add on Sep 2, 2004
* Just to optional port
*/

#include "unp.h"

void
dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE+1];

while(fgets(sendline, MAXLINE, fp) != NULL) {
if(xsendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen) < 0)
err_sys("sendto error!");

if ((n = xrecvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0)
err_sys("recvfrom error");

recvline[n] = 0;
printf("reply is %s", recvline);
/* recvline[n] = 0;
fputs(recvline,stdout); */
}
}

int
main(int argc ,char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
int port;

if(argc != 3)
err_quit("usage:8.7.2 <ipaddress> <port>");
port = atoi(argv[2]);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <0)
err_sys("inet_pton error");

sockfd = xsocket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
err_sys("socket create error!");

dg_cli(stdin, sockfd, (SA *)&servaddr, sizeof(servaddr));

exit(0);
}

服务器端:

#include "unp.h"

void dg_echo(int sockfd,SA *pcliaddr,socklen_t clilen);

int main(int argc,char **agrv)
{
int sockfd;
struct sockaddr_in servaddr,cliaddr;

sockfd = xsocket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
err_sys("can't create a socket");

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

if (xbind(sockfd, (SA *)&servaddr, sizeof(servaddr))<0)
err_sys("Bind is error!");

dg_echo(sockfd, (SA *)&cliaddr, sizeof(cliaddr));
exit(0);
}

void
dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];

for(;;) {
len = clilen;
n= xrecvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
if (n < 0)
err_sys("recvfrom is error");
mesg[n] = 0; /* null terminate */
printf("message is %s\n",mesg);
if (xsendto(sockfd,mesg,n,0,pcliaddr,len)<0)
err_sys("send to is error!");
}
}
laopang 2008-01-23
  • 打赏
  • 举报
回复
服务端不用绑定端口?

没有用recvfrom 先接收数据?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧