网络程序
最近在学习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 ;对就的字符串为非法参数。
哪位大侠帮我找一下哪里错了。谢谢