服务端代码:
#include <stdio.h> //包含tcp通讯所需系统头文件
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include<stdlib.h>
int main(int argc,char* argv[]) // 程序运行时,输入连接目标的地址和端口号
{
int s_fd; //创建服务端套接字句柄
struct sockaddr_in s_addr; //创建服务端socket结构体
struct sockaddr_in c_addr; //创建客户端socket结构体
int n_read;
int c_len;
int c_fd;
char msg[128]={0}; //创建消息数组(发送)
char readBuf[128]={0};; //创建消息数组(读取)
/*1.socket
2.bind
3.listen
4.accept
5.read
6.write */
s_fd = socket(AF_INET,SOCK_STREAM,0); //创建服务器套接字
s_addr.sin_family = AF_INET; //配置socket结构体参数
s_addr.sin_port = htons(atoi(argv[2])); //输入需要连接的端口号
inet_aton(argv[1],&s_addr.sin_addr); //输入连接到的IP地址
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in)); //捆绑socket和ip地址
listen(s_fd,20); //监听,服务端阻塞,等待客户端接入
while(1) // (父进程)不断接受客户端接入
{
c_len = sizeof( struct sockaddr_in);
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&c_len); //接收成功
if(c_fd == -1)
{
perror("accept error");
}
printf("connect success : %s\n", inet_ntoa(c_addr.sin_addr) );
if(fork()==0) //创建子进程
{
if(fork()==0) //发送子进程
{
while(1)
{
memset(msg,0,sizeof(msg)); //清空发送数组的数据
printf("please input : \n");
gets(msg); //输入发送的消息到数组
write(c_fd,msg,strlen(msg)); //向客户端写入消息
}
}
while(1) //读取子进程
{
memset(readBuf,0,sizeof(readBuf)); //清空读取数组的消息
n_read = read(c_fd,readBuf,128); //从客户端读取消息到readBuf
if(n_read == -1)
{
perror("read error");
}
else
{
printf("get message %d , %s\n",n_read,readBuf); /显示读取到的消息
}
}
//break;
}
}
return 0;
}
运行:./a.out ip地址 端口号
客户端代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char* argv[]) //运行时输入接入的IP地址和端口号
{
int c_fd;
int n_read;
struct sockaddr_in c_addr;
char ReadBuf[128]={0}; //初始化读取数组
char XieBuf[128]={0}; //初始化写入数组
/*1.socket
2.connect
3.write
4.read */
c_fd = socket(AF_INET,SOCK_STREAM,0); //创建客户端套接字句柄
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(atoi(argv[2])); //输入端口号
inet_aton(argv[1],&c_addr.sin_addr); //输入ip地址
int coreturn=connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)); //连接
if(coreturn == -1)
{
perror("connect");
exit(-1);
}
while(1) //连接完毕进入循环聊天
{
if(fork()==0) //子进程,用于发送
{
while(1)
{
memset(XieBuf,0,sizeof(XieBuf)); //清空消息数组
printf("please input: \n");
gets(XieBuf); //输入发送消息
write(c_fd,XieBuf,strlen(XieBuf)); //向服务端输入消息
}
}
while(1) //父进程,用于读取
{
memset(ReadBuf,0,sizeof(ReadBuf)); //清空消息数组
n_read = read(c_fd,ReadBuf,128); //将读取到的消息存入数组
if(n_read == -1)
{
perror("read");
exit(-1);
}
else{
printf("get message %d,%s \n",n_read,ReadBuf);
}
}
}
return 0;
}
运行: ./a.out ip地址 端口号