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;
}
相关推荐
失眠的稻草人25912 分钟前
【高阶数据结构】B-数、B+树、B*树的原理
数据结构·数据库·b树
令人着迷21 分钟前
Redis核心问题总结(一)
数据库·redis·缓存
小悟空GK26 分钟前
Http介绍
开发语言
java66666888834 分钟前
Spring Boot与HashiCorp Vault的集成
数据库·spring boot·oracle
502胶水20536 分钟前
腾讯地图异步调用
开发语言·ios·swift
Rcnhtin40 分钟前
Redis 典型应用——分布式锁
数据库·redis·分布式
SwBack1 小时前
【pearcmd】通过pearcmd.php 进行GetShell
android·开发语言·php
Lingoesforstudy1 小时前
c#中的超时终止
开发语言·笔记·c#
**K1 小时前
C++ 智能指针使用不当导致内存泄漏问题
开发语言·c++·算法
啊猪是的读来过倒1 小时前
Redis深度解析:核心数据类型与键操作全攻略
数据库·redis·缓存·核心数据类型·详细操作+案例