墨迹了很久,终于利用书上提供的模块,调通了 一个简单但完整的 客户端/服务器通讯的程序的代码。
闲言少叙,虽然比较简单也把代码贴出来为自己记录下学习的脚步。
服务器端代码:
/*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是一个很不错的程序员之间的交流平台,但是一直以来都是默默的从大家这里学习东西,一直也想上传点东西但总是以没有时间为自己找借口。这次终于迈出了第一步,虽然文章写很烂,不过也算是为我自己的旅程 留下些脚印。
不积跬步,无以至千里。就从这篇文章开始慢慢开始记录我自己的积累。