网络程序

wudongxu wudongxu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在学习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 ;对就的字符串为非法参数。
哪位大侠帮我找一下哪里错了。谢谢
...全文
评论 8
收藏 已收藏
分享
返回顶部
wudongxu
Linux/Unix社区 23,224 成员 74,535 内容