网络程序

wudongxu 2010-01-13 10:16:06
最近在学习Linux,在虚拟机上编了一个网络通信的程序但无法正常通信,各位大侠帮忙看一下:
功能就是客户端向服务器发送一个命令,服务把系统时间返回到客户端。
//客户端程序clienttime.c
#include <stdio.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <errno.h>

#define PORTL 6450
#define PORTR 6500
#define RECVBUFSIZE 128
#define CMD "getTime"

int sockInit(int *sockFd, struct sockaddr_in *addrL, struct sockaddr_in *addrR);

int main()
{
int sockFd = 0;
struct sockaddr_in addrLocate;
struct sockaddr_in addrRemote;
int recvSize = 0;
int addr_len = 0;
char sendBuf[] = CMD;
char recvBuf[RECVBUFSIZE] = {0};

printf("this is client time\n");

if (sockInit(&sockFd, &addrLocate, &addrRemote) < 0)
{
return -1;
}

if (sendto(sockFd, sendBuf, strlen(sendBuf), 0,
(struct sockaddr *)&addrRemote,
sizeof(struct sockaddr_in)) < 0)
{
printf("sendto error. errno = %d\n", errno);
close(sockFd);
return -1;
}
printf("sendto success\n");

if ((recvSize = recvfrom(sockFd, recvBuf, RECVBUFSIZE,
0, (struct sockaddr *)&addrRemote, &addr_len))
< 0)
{
printf("recvfrom error\n");
close(sockFd);
return -1;
}
printf("recvfrom success\n");

if (write(STDOUT_FILENO, recvBuf, recvSize) < 0)
{
printf("write error\n");
close(sockFd);
return -1;
}

close(sockFd);
return 0;
}

int sockInit(int *sockFd, struct sockaddr_in *addrL, struct sockaddr_in *addrR)
{
if ((*sockFd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("socket error\n");
return -1;
}

bzero(addrL, sizeof(struct sockaddr_in));
addrL->sin_family = AF_INET;
addrL->sin_port = htons(PORTL);
addrL->sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(*sockFd, (struct sockaddr *)addrL, sizeof(struct sockaddr)) < 0)
{
printf("bind error\n");
close(*sockFd);
return -1;
}

bzero(addrR, sizeof(struct sockaddr_in));
addrR->sin_family = AF_INET;
addrR->sin_port = htons(PORTR);
//addrR->sin_addr.s_addr = htonl(INADDR_ANY);
inet_pton(AF_INET, "127.0.0.1", &(addrR->sin_addr));

return 0;
}

//服务端程序servertime.c
#include <stdio.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>
#include <netinet/in.h>
#include <errno.h>

#define PORTL 6500
#define RECVBUFSIZE 128
#define CMD "getTime"
#define CMDSIZE 10

int sockInit(int *sockFd, struct sockaddr_in *addrL, struct sockaddr_in *addrR);

int main()
{
int sockFd = 0;
struct sockaddr_in addrLocate = {0};
struct sockaddr_in addrRemote = {0};
int recvSize = 0;
int addr_len = 0;
char cmdStr[] = CMD;
char sendBuf[RECVBUFSIZE] = {0};
char recvBuf[CMDSIZE] = {0};
time_t curTime = {0};

printf("this is server\n");

if (sockInit(&sockFd, &addrLocate, &addrRemote) < 0)
{
return -1;
}

if ((recvSize = recvfrom(sockFd, recvBuf, CMDSIZE,
0, (struct sockaddr *)&addrRemote, &addr_len))
< 0)
{
printf("recvfrom error\n");
close(sockFd);
return -1;
}

printf("revcfrom success\n");
printf("cmd: %s\n", recvBuf);

if (strcmp(cmdStr, recvBuf) == 0)
{
curTime = time((time_t *)NULL);
strcpy(sendBuf, ctime(&curTime));
printf("time: %s\n", sendBuf);
if (sendto(sockFd, sendBuf, strlen(sendBuf), 0,
(struct sockaddr *)&addrRemote,
sizeof(struct sockaddr_in)) < 0)
{
printf("sendto error. errstr = %s\n", strerror(errno));
close(sockFd);
return -1;
} printf("sendto success\n");
}
else
{
printf("command error.there is not '%s' command\n", recvBuf);
}

close(sockFd);
return 0;
}

int sockInit(int *sockFd, struct sockaddr_in *addrL, struct sockaddr_in *addrR)
{
if ((*sockFd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("socket error\n");
return -1;
}

bzero(addrL, sizeof(struct sockaddr_in));
addrL->sin_family = AF_INET;
addrL->sin_port = htons(PORTL);
(addrL->sin_addr).s_addr = htonl(INADDR_ANY);
//inet_pton(AF_INET, "127.0.0.1", &(addrL->sin_addr));

if (bind(*sockFd, (struct sockaddr *)addrL, sizeof(struct sockaddr)) < 0)
{
printf("bind error\n");
close(*sockFd);
return -1;
}

bzero(addrR, sizeof(struct sockaddr_in));

return 0;
}

程序运行的时候在红色的地方退出了,并且打印下来的errno = 22 ;对就的字符串为非法参数。
哪位大侠帮我找一下哪里错了。谢谢
...全文
108 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤过儿 2010-01-14
  • 打赏
  • 举报
回复
这程序是 <UNIX网络编程> 第一卷前几章的范例程序~~
wudongxu 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 deep_pro 的回复:]
引用 5 楼 wudongxu 的回复:
确实是该错误,但还没搞明白?
在recvfrom里不是传指针吗?它不是从远程端中获得该值吗?怎么还要给它赋值了?

虽然远程会给他赋值,但我想赋值前还是会先使用到一次他的值
有兴趣可以拿libc的源码看看
[/Quote]

恩,谢谢
deep_pro 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wudongxu 的回复:]
确实是该错误,但还没搞明白?
在recvfrom里不是传指针吗?它不是从远程端中获得该值吗?怎么还要给它赋值了?
[/Quote]
虽然远程会给他赋值,但我想赋值前还是会先使用到一次他的值
有兴趣可以拿libc的源码看看
wudongxu 2010-01-13
  • 打赏
  • 举报
回复
确实是该错误,但还没搞明白?
在recvfrom里不是传指针吗?它不是从远程端中获得该值吗?怎么还要给它赋值了?
wudongxu 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 deep_pro 的回复:]
找到了
int addr_len = sizeof(addrRemote);

你所有的recvfrom的最后一个参数都没有初始化
[/Quote]

在recvfrom里不是传指针吗?它不是从远程端中获得该值吗?
deep_pro 2010-01-13
  • 打赏
  • 举报
回复
找到了
int addr_len = sizeof(addrRemote);

你所有的recvfrom的最后一个参数都没有初始化
wudongxu 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 deep_pro 的回复:]
没耐心看
你用
perror("xx error")
能够看到具体的错误代码的含义
[/Quote]
已经知道了错误编号22,及意义是:非法参数。
红色标志的是错误的地方,帮忙看一下吧大侠。
deep_pro 2010-01-13
  • 打赏
  • 举报
回复
没耐心看
你用
perror("xx error")
能够看到具体的错误代码的含义

23,110

社区成员

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

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