111111

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#define port 12000
#define maxn 2000
void func_back(int sig){
	printf("与客户端连接已中断, End!\n");	
	exit(0);
}
int main(){
	socklen_t len;
	int socket_fd,pid,res,sign,connfd,pp=1;
	socklen_t clientaddr_len; 
	struct sockaddr_in serveraddr,clientaddr;
	char buf[maxn + 10]; 
	setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &pp, sizeof(int));  // 防止出现端口被占用的情况
	socket_fd = socket(AF_INET,SOCK_STREAM,0);   // 创建套接字
	if(socket_fd==-1){
		perror("套接字创建失败!\n");
		exit(0);
	}
	serveraddr.sin_family = AF_INET;  //地址族(类型),这里是ipv4
	serveraddr.sin_port = htons(port);   // 获取端口号
	serveraddr.sin_addr.s_addr = INADDR_ANY; //任何ip地址
	bzero(serveraddr.sin_zero,8);   //把sin_zero清空
	res = bind(socket_fd, (struct sockaddr *)(&serveraddr),sizeof(serveraddr));	//bind绑定,将套接字socket_fd与serveraddr进行绑定 
	if(res==-1){
		perror("服务器绑定失败!\n");
		exit(0);
	}
	//listen声明socket_fp处于监听状态,2是监听的最大客户端数,即最多监听2个
	res = listen(socket_fd,2);
	if(res==-1){
		perror("服务器监听失败!\n");
		exit(0);
	}
	printf("服务器端已经启动!\n");
	while(1){
		clientaddr_len = sizeof(struct sockaddr);
		connfd= accept(socket_fd,(struct sockaddr*)(&clientaddr),&clientaddr_len);  //阻塞接受来自客户端的连接
		if(connfd== -1){
    		perror("接受连接失败!\n");
    		exit(0);
       	}
    	else printf("与客户端连接成功!\n");
        int pid=fork();
    	while(1){
    		if(pid>0){ //父进程接受信息 
		        signal(SIGINT,func_back);//用于发出end
         		bzero(buf, maxn + 1);
  		        if(len = recv(connfd,buf, maxn, 0) == 0){  //成功返回时,返回从长为maxn的buf缓存区中接受的字节数,0则表示客户端关闭了连接
         			kill(pid, SIGINT);  //用于发出end
				    close(socket_fd);
             		exit(0);
       			}
        	    printf("client :%s",buf);
    		}
		else if(pid == 0){ //子进程发送信息
        		bzero(buf, maxn + 1);
        		fgets(buf,maxn,stdin);
        		len = send(connfd, buf, strlen(buf), 0);              
        	 }
    	}
    }
    return 0;
}

1111

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/msg.h>
#include <sys/socket.h>
#include <sys/types.h>
#define port 12000
#define maxn 2000
void func_back(int sig){
	printf("与服务器端连接已中断, End!\n");	
	exit(0);
}
int main(){
	socklen_t len;  //套接字长度
	int res,pid,socket_fd;
	struct sockaddr_in serveraddr;
	char buf[maxn + 10];  //缓冲区用于客户端与服务端间传递信息
	socket_fd = socket(AF_INET,SOCK_STREAM,0);  // 创建套接字
	if(socket_fd==-1){
		perror("套接字创建失败!\n");
		exit(0);
	}
	serveraddr.sin_family = AF_INET;  //地址族(类型),这里是ipv4
	serveraddr.sin_port = htons(port);  // 获取端口号
   	inet_aton("127.0.0.1",&serveraddr.sin_addr);  //特定主机地址, 127.0.0.1是环回地址,即自己
    	bzero(serveraddr.sin_zero,8);  //把sin_zero清空
	res  = connect(socket_fd, (struct sockaddr *)(&serveraddr),sizeof(serveraddr));  //连接服务器
	if(res==-1){
		perror("连接失败!\n");
		exit(0);
	}
	printf("与服务器端连接成功!\n");
    	pid = fork();
    	while(1){
        	if(pid ==  0){  //子进程接受信息
            		bzero(buf, maxn + 1);  //清空缓冲区
           		if( len = recv(socket_fd, buf, maxn, 0)== 0){  //成功返回时,返回从长为maxn的buf缓存区中接受的字节数,0则表示与服务端间的连接断开了
              			kill(pid , SIGINT);  //向子进程发送中止信号
              			close(socket_fd);
              			exit(0);
            		}
            		printf("Server:%s",buf);
        	}
		else if(pid > 0){  //父进程发送信息
            		signal(SIGINT , func_back);  //用signal接收从父进程来的中止信号,输出end
            		bzero(buf, maxn + 1);
            		fgets(buf,maxn,stdin);  //读入
            		len = send(socket_fd, buf, strlen(buf), 0);  //发送
       	 	}
	}
    /* 关闭连接 */
    close(socket_fd);

    return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值