TCP 通信中服务端流程代码
#include <header.h>
#define SER_PORT 8888
#define SER_IP "192.168.125.78"
int main(int argc, const char *argv[])
{
int sfd = socket(AF_INET, SOCK_STREAM, 0); //创建一个端点
if(sfd == -1){
perror("socket error");
return -1;
}
//准备地址信息结构体
//1.准备地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET; //通信域
sin.sin_port = htons(SER_PORT); //端口号
sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址
// 2.绑定工作
if(bind( sfd, ( struct sockaddr* )&sin, sizeof(sin) ) == -1) {
perror("error");
}
printf("bind success\n");
// 3.将套接字设置成被动监听状态
if(listen(sfd, 128)==-1){
perror("listen erro");
return -1;
}
printf("listen success\n");
// 4.阻塞等待客户端的连接
// 4.1定义用户接收客户端信息的容器
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
if( newfd ==-1 ){
perror("error");
}
printf("%s,%d有新客户端发来连接请求\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
char rbuf[128] = ""; //读取消息内容的容器
while(1){
//清空容器
bzero(rbuf,sizeof(rbuf));
//从套接字中读取数据
int res = recv(newfd, rbuf, sizeof(rbuf),0);//对方下线,返回0
if(res == 0){
printf("客户端已经下线\n");
break;
}
//将该读取的消息展示出来
printf("%s:%d:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf );
//处理收到的消息,回复给客户端
strcat(rbuf,"*_*");
//将消息发送给客户端
send( newfd, rbuf, strlen(rbuf), 0);
printf("发送成功\n");
}
close(newfd);
close(sfd);
return 0;
}
TCP连接客户端代码
#define SER_PORT 8888
#define SER_IP "192.168.125.78"
#define CLI_PORT 6666
#define CLI_IP "192.168.125.78"
#include <header.h>
int main(int argc, const char *argv[])
{
//创建用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_STREAM, 0);
if(cfd == -1){
perror("socket err");
return -1;
}
printf("cfd = %d\n", cfd);
//绑定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);
//绑定IP地址和端口号
if( bind( cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1 ){
perror("bind-error");
return -1;
}
printf("bind-success\n");
//连接服务器
//准备对端地址信息结构体
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;
}
printf("connect sccess\n");
//数据收发
char wbuf[128] = "";
char rbuf[128] = "";
while(1){
//从终端获取要发送的数据
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1] ='\0';
//将数据发送给服务器
send(cfd,wbuf,strlen(wbuf),0);
printf("发送成功\n");
//接收服务器发送的消息
bzero(rbuf,sizeof(rbuf));
recv(cfd, rbuf, sizeof(rbuf), 0);
printf("服务器发来的消息为:%s\n",rbuf);
}
//关闭套接字
close(cfd);
return 0;
}
UDP通信中服务端流程代码
#include <header.h>
#define SER_PORT 8888
#define SER_IP "192.168.125.78"
int main(int argc, const char *argv[])
{
//创建用于通信的套接字文件描述符
inf sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd == -1){
perror("socket erroe");
return -1;
}
printf("SFD = %d\n", sfd);
//绑定IP地址和端口号
//填充地址信息结构体
struct sockaddr_in sin;
sin.sinfamily = AF_INET;
sin.sin_port = htons(SER_PORT);
sin.sin_affr.s_addr = inet_addr(SER_IP);
//绑定IP地址和端口号
if( bind( sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1 ){
perror("bind-error");
return -1;
}
printf("bind-success");
//数据收发
char rbuf[128] = "";
//准备接收对端地址信息
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
while(1){
bzero(rubf,sizeof(rbuf));
//读取数据
recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cin, &addrlen)
printf("服务器发来的消息为:%s\n",rbuf);
//回复消息
strcat(rbuf,"*-*");
if( sendto( sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cin, sizeof(cin) ) == -1){
perror("write error");
return -1;
}
}
close(sfd)
return 0;
}
UDP通信中客户端流程代码
#include <header.h>
#define SER_PORT 8888
#define SER_IP "192.168.125.78"
#define CLI_PORT 6666
#define CLI_IP "192.168.125.78"
int main(int argc, const char *argv[])
{
//创建用于通信的套接字文件描述符
int cfd = socket(AF_INET,SOCK_DGRAM,0);
if(cfd == -1){
perror("socket erroe");
return -1;
}
printf("cFD = %d\n", cfd);
//数据收发
char wbuf[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);
CHAR RBUF[128] = "";
while(1){
bzero(rbuf,sizeof(rbuf));
bzero(wbuf,sizeof(wbuf));
fgets(wbuf, sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1] = 0;
sendto( cfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&sin, sizeof(sin) );
//读取数据
recvfrom(cfd, rbuf, sizeof(rbuf), 0, NULL, NULL);
printf("服务器发来的消息为:%s\n",rbuf);
}
close(cfd)
return 0;
}