Linux C 编程一站式学习--Unix Domain Socket IPC 练习代码



    墨迹了很久,终于利用书上提供的模块,调通了 一个简单但完整的 客户端/服务器通讯的程序的代码。


    闲言少叙,虽然比较简单也把代码贴出来为自己记录下学习的脚步。


    服务器端代码:

/*server.c*/

#include "serv_listen.h"
#include "serv_accept.h"

const int MAXLEN = 80;

int main(void)
{
	char* fdname;

	int listenfd = serv_listen("fdname.sock"); 

	if ( listenfd<0 )
	{
		printf("listen failure: %d\n", listenfd);
		exit(-1);
	}

	int i = 0;
	int childfd , isRunning;
	isRunning = 1 ;

	uid_t* cliUidPtr=NULL;

	char cliData[MAXLEN];

	while ( isRunning )
	{
		childfd = serv_accept(listenfd, cliUidPtr);

		while (1)
		{
			int actLen = read(childfd, cliData, MAXLEN);

			for ( i=0; i<actLen; i++ )
				cliData[i] = toupper(cliData[i]);


			write(childfd, cliData, strlen(cliData));
		}
		close(childfd);
	}
}


    客户端代码:

/*client.c*/

#include <stdio.h>
#include <stddef.h>
#include <unistd.h>
#include <string.h>
#include "cli_connect.h"

const int MAXLEN = 80;

int main()
{
	int fd;
	int actLen = 0;
	char buf[MAXLEN];

	fd = cli_connect("fdname.sock");
	if ( fd < 0 )
	{
		printf("connection failure: %d\n", fd);
		exit(-1);
	}

	while ( fgets(buf, MAXLEN, stdin) != NULL )
	{
		if ( write(fd, buf, strlen(buf)) == -1 )
			printf("write error\n");
			
		
		actLen = read(fd, buf, MAXLEN);
		if ( actLen==-1 )
		{
			perror("Line read error\n");
			exit(-1);
		}

		write(STDOUT_FILENO, buf, actLen);
	
	}
	close(fd);
}

    另外,附上几个模块的头文件:

cli_connect.h

/*cli_connect.h*/

#ifndef _CLI_CONNECTION
#define _CLI_CONNECTION

#include <stdio.h>
#include <stddef.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>

int cli_connect(const char* name);

#endif

serv_listen.h

/*serv_listen.h*/

#ifndef _SERV_LISTEN
#define _SERV_LISTEN

#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>

/*
 * Create a server endpoint connection
 * Return :
 *   1. >=0 : return the fd, 
 *   2. <0  : on error
 * */

int serv_listen(const char* fname);

#endif

serv_accept.h

#ifndef _SERV_ACCEPT
#define _SERV_ACCEPT

#include <stdio.h>
#include <stddef.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>

int serv_accept(int listenfd, uid_t *uidptr);

#endif


        这次调试这个代码遇到了一个问题: 客户端 始终无法 connect (return -1) 上服务器。

        上网查找资料看了很久也一直没有找到症结所在,后来才突然想起了 用 printf("%s\n", strerror(errno));  把错误信息以字符串的方式打印出来的方法。

        打印的错误信息:

        “No such file or directory”

        经过检查才发现自己的服务器端代码,在serv_listen 模块里sockaddr_un 的实际长度算错了。没有加上strlen(name)(粗心大意害死人).

        但是奇怪的是 bind 函数并没有返回错误信息,socket文件也没有创建成功。还希望哪位大牛能够帮忙分析分析。


        真是应了那句话,万事开头难。以前一直认为CSDN是一个很不错的程序员之间的交流平台,但是一直以来都是默默的从大家这里学习东西,一直也想上传点东西但总是以没有时间为自己找借口。这次终于迈出了第一步,虽然文章写很烂,不过也算是为我自己的旅程 留下些脚印。

        不积跬步,无以至千里。就从这篇文章开始慢慢开始记录我自己的积累。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值