分别使用TCP和UDP实现服务器和客户端通信
代码:
/*******************************************/
文件名:tcpser.c
/*******************************************/
#include <myhead.h>
#define SER_PORT 6666 //服务器端口号
#define SER_IP "192.168.2.91" //服务器ip地址
int main(int argc, char const *argv[])
{
//创建服务器套接字文件描述符
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd == -1)
{
perror("socket error");
return -1;
}
//绑定ip地址和端口号
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT);
sin.sin_addr.s_addr = inet_addr(SER_IP);
//将端口号快速重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
{
perror("setsockopt error");
return -1;
}
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
{
perror("bind error");
return -1;
}
if (listen(sfd, 128) == -1)
{
perror("listen error");
return -1;
}
char buf[128] = "";
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
//创建一个用于通信的文件描述符
int newfd = accept(sfd, (struct sockaddr *)&cin, &addrlen);
if (newfd == -1)
{
perror("accept error");
return -1;
}
printf("[%s:%d]: 已成功连接一个客户端\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
while (1)
{
//清除缓存
bzero(buf, sizeof(buf));
//读取客户端的信息
int temp = recv(newfd, buf, sizeof(buf), 0);
if (temp == -1)
{
perror("recv error");
return -1;
}
else if (temp == 0)
{
printf("客户机已下线\n");
break;
}
printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
strcat(buf, "^v^");
//将信息传递给客户端
if (send(newfd, buf, strlen(buf), 0) == -1)
{
perror("send error");
return -1;
}
}
close(sfd);
return 0;
}
/*******************************************/
文件名:tcpcli.c
/*******************************************/
#include <myhead.h>
#define SER_PORT 6666 //服务器端口号
#define SER_IP "192.168.2.91" //服务器ip地址
#define CLI_PORT 8888 //客户端端口号
#define CLI_IP "192.168.2.91" //客户端ip地址
int main(int argc, char const *argv[])
{
//创建客户端套接字文件描述符
int cfd = socket(AF_INET, SOCK_STREAM, 0);
if (cfd == -1)
{
perror("socket error");
return -1;
}
//创建结构体绑定ip地址和端口号
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(CLI_PORT);
cin.sin_addr.s_addr = inet_addr(CLI_IP);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT);
sin.sin_addr.s_addr = inet_addr(SER_IP);
if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
{
perror("connect error");
return -1;
}
char buf[128] = "";
while (1)
{
//从终端获取信息
printf("请输入>>>");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = 0;
if (strcmp(buf, "quit") == 0)
{
break;
}
//向服务器传输信息
if (send(cfd, buf, strlen(buf), 0) == -1)
{
perror("send error");
return -1;
}
//清除缓存
bzero(buf, sizeof(buf));
//接收服务器的信息
if (recv(cfd, buf, sizeof(buf), 0) == -1)
{
perror("recv error");
return -1;
}
printf("收到信息为:%s\n",buf);
}
close(cfd);
return 0;
}
/*******************************************/
文件名:udpser.c
/*******************************************/
#include <myhead.h>
#define SER_PORT 7777 //服务器端口号
#define SER_IP "192.168.2.91" //服务器ip地址
int main(int argc, char const *argv[])
{
//创建服务器套接字文件描述符
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sfd == -1)
{
perror("socket error");
return -1;
}
//绑定ip地址和端口号
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT);
sin.sin_addr.s_addr = inet_addr(SER_IP);
//将端口号快速重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
{
perror("setsockopt error");
return -1;
}
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
{
perror("bind error");
return -1;
}
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
char buf[128] = "";
while (1)
{
//清除缓存
bzero(buf, sizeof(buf));
//获取客户端信息
if(recvfrom(sfd, buf, sizeof(buf), 0,(struct sockaddr*)&cin,&addrlen )==-1){
perror("recvfrom error");
return -1;
}
printf("收到消息为:%s\n",buf);
strcat(buf,"^v^");
if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&cin,sizeof(cin))==-1){
perror("sendto error");
return -1;
}
}
close(sfd);
return 0;
}
/*******************************************/
文件名:udpcli.c
/*******************************************/
#include <myhead.h>
#define SER_PORT 7777 //服务器端口号
#define SER_IP "192.168.2.91" //服务器ip地址
#define CLI_PORT 9999 //客户端端口号
#define CLI_IP "192.168.2.91" //客户端ip地址
int main(int argc, char const *argv[])
{
//创建客户端套接字文件描述符
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if (cfd == -1)
{
perror("socket error");
return -1;
}
//绑定ip地址和端口号
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(CLI_PORT);
cin.sin_addr.s_addr = inet_addr(CLI_IP);
//将端口号快速重用
int reuse = 1;
if (setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
{
perror("setsockopt error");
return -1;
}
if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1)
{
perror("bind error");
return -1;
}
char buf[128] = "";
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT);
sin.sin_addr.s_addr = inet_addr(SER_IP);
while (1)
{
//从终端中获取信息
printf("请输入>>>");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = 0;
//向服务器传输信息
if (sendto(cfd, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
perror("sendto error");
return -1;
}
//清除缓存
bzero(buf, sizeof(buf));
//获取服务器信息
if (recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL) == -1)
{
perror("recvfrom error");
return -1;
}
printf("收到信息为:%s\n", buf);
}
close(cfd);
return 0;
}