6.19作业

TCP服务器

c 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>

#define PORT 8888
#define IP "192.168.124.39"

#define ERR_MSG(msg) do{\
	fprintf(stderr,"line:%d",__LINE__);\
	fprintf(stderr,"func:%s",__func__);\
	perror(msg);\
	}while(0)

int main(int argc, const char *argv[])
{
	//创建流式套节奏
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd<0){
		ERR_MSG("socket");
		return -1;
	}
	printf("流式套节奏创建完毕 sfd=%d\n",sfd);


    //允许端口快速被复用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口快速重用\n");



	//填充服务器地址信息结构体给bind函数使用
	//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;//必须填AF_INET
	sin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151
	sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式

	//绑定服务器地址信息,必须绑定
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){
		ERR_MSG("bing");
		return -1;
	}
	//将套节奏设置为被动监听状态
	if(listen(sfd,128)<0){
		ERR_MSG("listen");
		return -1;
	}
	printf("监听成功\n");
	//获取连接成功的客户端信息,生成一个新的套节奏文件描述符
	struct sockaddr_in cin;
	socklen_t addrlen=sizeof(cin);

	int newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
	if(newfd<0){
		ERR_MSG("accpet");
		return -1;
	}
	printf("[%s:%d] newfd=%d 客户端链接成功\n",\
			inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);

	char buf[128]="";
	ssize_t res;
	char buf2[128]="";
	ssize_t res2;
	while(1){
		bzero(buf,sizeof(buf));
		//接收
		res=recv(newfd,buf,sizeof(buf),0);
		if(res<0){
			ERR_MSG("recv");
			return -1;
		}else if(res==0){
			printf("[%s:%d]客户端下线\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
			break;
		}
		printf("[%s:%d]newfd=%d: %s\n",\
				inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);
		//发送
		res2=send(newfd,buf,sizeof(buf),0);
		if(res2<0){
			ERR_MSG("send");
			return -1;
		}
		printf("发送成功\n");
	}
	//关闭文件描述符
	if(close(sfd)<0){
		ERR_MSG("close");
		return -1;
	}
	return 0;
}

TCP客服端

c 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>

#define PORT 8888
#define IP "192.168.124.38"

#define ERR_MSG(msg) do{\
	fprintf(stderr,"line:%d\n",__LINE__);\
	fprintf(stderr,"func:%s\n",__func__);\
	perror(msg);\
	}while(0)

int main(int argc, const char *argv[])
{
	//创建流式套节奏
	int cfd=socket(AF_INET,SOCK_STREAM,0);
	if(cfd<0){
		ERR_MSG("socket");
		return -1;
	}
	printf("流式套节奏创建完毕 cfd=%d\n",cfd);

	//填充服务器地址信息结构体给bind函数使用
	//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip
	/*
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;//必须填AF_INET
	sin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151
	sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式
	*/
	struct sockaddr_in sin2;
	sin2.sin_family=AF_INET;//必须填AF_INET
	sin2.sin_port=htons(PORT);//端口号的网络字节序 1024~49151
	sin2.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式

	//绑定客户端地址信息,不是必须绑定
	//未绑定由于电脑自动分配一个端口号
	/*
	if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin))<0){
		ERR_MSG("bing");
		return -1;
	}
	*/
	//链接指定的服务器
	if(connect(cfd,(struct sockaddr*)&sin2,sizeof(sin2))<0){
		ERR_MSG("connect");
		return -1;
	}
	printf("连接服务器[%s:%d]成功\n",IP,PORT);

	char buf[128]="hello";
	ssize_t res;
	char buf2[128]="";
	ssize_t res2;
	while(1){
		bzero(buf,sizeof(buf2));		//发送
		printf("请输入:");
		fgets(buf2,sizeof(buf2),stdin);
		res2=send(cfd,buf2,sizeof(buf2),0);
		if(res2<0){
			ERR_MSG("send");
			return -1;
		}
		printf("发送成功\n");
		//接收
		bzero(buf,sizeof(buf));
		res=recv(cfd,buf,sizeof(buf),0);
		if(res<0){
			ERR_MSG("recv");
			return -1;
		}else if(res==0){
			printf("[%s:%d]cfd=%d服务器下线\n",IP,PORT,cfd);
			break;
		}
		printf("[%s:%d]newfd=%d : %s\n",IP,PORT,cfd,buf);
	}
	//关闭文件描述符
	if(close(cfd)<0){
		ERR_MSG("close");
		return -1;
	}
	return 0;
}

UDP服务器

c 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>      
#define PORT 6666
#define IP "192.168.124.39"

#define ERR_MSG(msg) do{\
	fprintf(stderr,"line:%d",__LINE__);\
	fprintf(stderr,"func:%s",__func__);\
	perror(msg);\
}while(0)

int main(int argc, const char *argv[])
{
	//创建报式套节字
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd<0){
		ERR_MSG("sfd");
		return -1;
	}
	printf("报式套接字创建成功,sfd=%d\n",sfd);

	//允许端口快速被复用
	int reuse = 1;
	if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}
	printf("允许端口快速重用\n");

	//填充服务器的地址信息结构体给bind函数使用
	//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;//必须填AF_INET
	sin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151
	sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式

	//绑定服务器的地址信息,必须绑定
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){
		ERR_MSG("bing");
		return -1;
	}
	printf("绑定成功\n");
	char buf[128]="";
	struct sockaddr_in cin;//存储接收到的对端的地址信息
	socklen_t addrlen=sizeof(cin);
	while(1){
		bzero(buf,sizeof(buf));
		//接收数据
		//if(recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL)<0){
		if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0){
			ERR_MSG("recvrom");
			return -1;
		}
		printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
		//发送数据
		strcat(buf,"*-*");
		if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){
			ERR_MSG("sendto");
			return -1;
		}
		printf("发送成功\n");
	}
	//关闭套接字文件描述符
	close(sfd);
	return 0;
}

UDP客户端

c 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>      
#define PORT 6666
#define IP "192.168.124.39"

#define ERR_MSG(msg) do{\
	fprintf(stderr,"line:%d",__LINE__);\
	fprintf(stderr,"func:%s",__func__);\
	perror(msg);\
}while(0)

int main(int argc, const char *argv[])
{
	//创建报式套节字
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd<0){
		ERR_MSG("sfd");
		return -1;
	}
	printf("报式套接字创建成功,sfd=%d\n",sfd);

	//允许端口快速被复用
	int reuse = 1;
	if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}
	printf("允许端口快速重用\n");

	//填充服务器的地址信息结构体给bind函数使用
	//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip
	
	//填充对端地址信息结构体,给se
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;//必须填AF_INET
	sin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151
	sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式

	//绑定服务器的地址信息,必须绑定
	/*
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){
		ERR_MSG("bing");
		return -1;
	}
	printf("绑定成功\n");
	*/
	char buf[128]="";
	char buf2[128]="";
	struct sockaddr_in cin;//存储接收到的对端的地址信息
	socklen_t addrlen=sizeof(cin);
	while(1){
		bzero(buf2,sizeof(buf));
		//发送数据
		printf("请输入:");
		fgets(buf2,sizeof(buf2),stdin);
		buf[strlen(buf)-1]='\0';
		if(sendto(sfd,buf2,sizeof(buf2),0,(struct sockaddr*)&sin,sizeof(sin))<0){
			ERR_MSG("sendto");
			return -1;
		}
		printf("发送成功\n");


		bzero(buf,sizeof(buf));
		//接收数据
		//if(recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL)<0){
		if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0){
			ERR_MSG("recvrom");
			return -1;
		}
		printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
		}
	//关闭套接字文件描述符
	close(sfd);
	return 0;
}
相关推荐
陌小呆^O^9 分钟前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
黑客Ela16 分钟前
网络安全中常用浏览器插件、拓展
网络·安全·web安全·网络安全·php
Gu Gu Study16 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
时光の尘30 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
以后不吃煲仔饭44 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师1 小时前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者1 小时前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
The_Ticker1 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
程序猿阿伟1 小时前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
Elastic 中国社区官方博客1 小时前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索