#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;
}
778

被折叠的 条评论
为什么被折叠?



