基于TCP的socket通信,实现加减乘除(方法一)
2017-12-04 14:49
603 查看
服务器端:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/wait.h>
#include<errno.h>
#include<unistd.h>
#include<signal.h>
#include<netdb.h>
void sig_handler(int signo)
{
pid_t pid;
int stat;
pid=waitpid(-1,&stat,WNOHANG);
while(pid>0){
printf("child process terminated (PID:%ld)\n",(long)getpid());
pid=waitpid(-1,&stat,WNOHANG);
}
return ;
}
typedef struct {
char s[10];
int a;
int b;
char m[1024];
}Message;
int main(int argc,char *argv[])
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int result,a,b;
int s[2];
static char recv_buf[1024];
int len;
int port;
pid_t pid;
char *delim = " ";
char *p;
char *c;
struct sockaddr_in clt_addr;
struct sockaddr_in srv_addr;
//服务器端运行时要给出端口信息,该端口为监听端口
if(argc!=2){
printf("Usage:%s port\n",argv[0]);
return 1;
}
//获得输入的端口
port=atoi(argv[1]);
//设置信号处理函数,也可以使用sigaction函数
if(signal(SIGCHLD,sig_handler)<0){
perror("cannot set the signal");
return 1;
}
//创建套接字用于服务器的监听
listen_fd=socket(PF_INET,SOCK_STREAM,0);
if(listen_fd<0){
perror("cannot create listening socket");
return 1;
}
bzero(&srv_addr,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
srv_addr.sin_port=htons(port);
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==1)
{
perror("cannot bind server socket");
close(listen_fd);
return 1;
}
//监听指定端口 ,连接一千个客户端
ret=listen(listen_fd,
a90f
1000);
if(ret==-1){
perror("cannot listen the client connect request");
return 1;
}
//对每个连接来的客户端创建一个进程,单独与其进行通信
//首先调用read函数读取客户端发送来的信息
while(1){
len=sizeof(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
if(com_fd<0){
if(errno==EINTR){
continue;
}else{
perror("cannot accept client connect request");
close(listen_fd);
return 1;
}
}
pid=fork();
if(pid<0){
perror("cannot create the child process");
close(listen_fd);
return 1;
}else if(pid==0){
while(1){
bzero(recv_buf, 1024);
read(com_fd,recv_buf,1024);
p=strtok(recv_buf,delim);
if(p)
c=p;
int i=1;
while(p=strtok(NULL,delim)){
s[i]=p;
i++;
}
a=atoi(s[1]);
b=atoi(s[2]);
printf("接收到客户端的信息:%s %d %d\n",c,a,b);
if(strcmp(c,"add")==0)
result=a+b;
if(strcmp(c,"sub")==0)
result=a-b;
if(strcmp(c,"mul")==0)
result=a*b;
if(strcmp(c,"div")==0)
result=a/b;
printf("result=%d\n",result);
bzero(recv_buf, 1024);
sprintf(recv_buf,"%d",result);
write(com_fd,recv_buf,strlen(recv_buf) + 1);
}
close(com_fd);
return 0;
}
}
return 0;
}
客户端:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netdb.h>
#include<unistd.h>
int main(int argc,char *argv[]){
int connect_fd;
int ret;
int i;
int port;
int len;
static char snd_buf[1024];
static struct sockaddr_in srv_addr;
typedef struct {
char s[10];
int a;
int b;
char m[1024];
}Message;
//客户端运行需要给出具体的链接地址和端口
if(argc!=3){
printf("Usage:%s server_ip_address port\n",argv[0]);
return 1;
}
port=atoi(argv[2]);
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<0){
perror("cannot create communication socket");
return 1;
}
bzero(&srv_addr,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_port=htons(port);
//连接指定的服务器
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1){
perror("cannot connect to the server");
close(connect_fd);
return 1;
}
int size = 1024;
//用户输入信息后,程序将输入的信息通过套接字发送给服务器
//然后调用read函数从服务器中读取发送来的消息
while(1){
write(STDOUT_FILENO,"请输入需要的操作:",27);
bzero(snd_buf,size);
len=read(STDIN_FILENO,snd_buf,1024);
if(len>0){
write(connect_fd,snd_buf,strlen(snd_buf) + 1);
}
len=read(connect_fd,snd_buf,size);
if(len>0)
printf("服务器返回的结果:%s,长度为:%d\n",snd_buf, len);
}
close(connect_fd);
return 0;
}
程序运行:
#./server 5000
#./client 192.168.1.124 5000
IP写你自己服务器的IP
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/wait.h>
#include<errno.h>
#include<unistd.h>
#include<signal.h>
#include<netdb.h>
void sig_handler(int signo)
{
pid_t pid;
int stat;
pid=waitpid(-1,&stat,WNOHANG);
while(pid>0){
printf("child process terminated (PID:%ld)\n",(long)getpid());
pid=waitpid(-1,&stat,WNOHANG);
}
return ;
}
typedef struct {
char s[10];
int a;
int b;
char m[1024];
}Message;
int main(int argc,char *argv[])
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int result,a,b;
int s[2];
static char recv_buf[1024];
int len;
int port;
pid_t pid;
char *delim = " ";
char *p;
char *c;
struct sockaddr_in clt_addr;
struct sockaddr_in srv_addr;
//服务器端运行时要给出端口信息,该端口为监听端口
if(argc!=2){
printf("Usage:%s port\n",argv[0]);
return 1;
}
//获得输入的端口
port=atoi(argv[1]);
//设置信号处理函数,也可以使用sigaction函数
if(signal(SIGCHLD,sig_handler)<0){
perror("cannot set the signal");
return 1;
}
//创建套接字用于服务器的监听
listen_fd=socket(PF_INET,SOCK_STREAM,0);
if(listen_fd<0){
perror("cannot create listening socket");
return 1;
}
bzero(&srv_addr,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
srv_addr.sin_port=htons(port);
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==1)
{
perror("cannot bind server socket");
close(listen_fd);
return 1;
}
//监听指定端口 ,连接一千个客户端
ret=listen(listen_fd,
a90f
1000);
if(ret==-1){
perror("cannot listen the client connect request");
return 1;
}
//对每个连接来的客户端创建一个进程,单独与其进行通信
//首先调用read函数读取客户端发送来的信息
while(1){
len=sizeof(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
if(com_fd<0){
if(errno==EINTR){
continue;
}else{
perror("cannot accept client connect request");
close(listen_fd);
return 1;
}
}
pid=fork();
if(pid<0){
perror("cannot create the child process");
close(listen_fd);
return 1;
}else if(pid==0){
while(1){
bzero(recv_buf, 1024);
read(com_fd,recv_buf,1024);
p=strtok(recv_buf,delim);
if(p)
c=p;
int i=1;
while(p=strtok(NULL,delim)){
s[i]=p;
i++;
}
a=atoi(s[1]);
b=atoi(s[2]);
printf("接收到客户端的信息:%s %d %d\n",c,a,b);
if(strcmp(c,"add")==0)
result=a+b;
if(strcmp(c,"sub")==0)
result=a-b;
if(strcmp(c,"mul")==0)
result=a*b;
if(strcmp(c,"div")==0)
result=a/b;
printf("result=%d\n",result);
bzero(recv_buf, 1024);
sprintf(recv_buf,"%d",result);
write(com_fd,recv_buf,strlen(recv_buf) + 1);
}
close(com_fd);
return 0;
}
}
return 0;
}
客户端:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netdb.h>
#include<unistd.h>
int main(int argc,char *argv[]){
int connect_fd;
int ret;
int i;
int port;
int len;
static char snd_buf[1024];
static struct sockaddr_in srv_addr;
typedef struct {
char s[10];
int a;
int b;
char m[1024];
}Message;
//客户端运行需要给出具体的链接地址和端口
if(argc!=3){
printf("Usage:%s server_ip_address port\n",argv[0]);
return 1;
}
port=atoi(argv[2]);
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<0){
perror("cannot create communication socket");
return 1;
}
bzero(&srv_addr,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_port=htons(port);
//连接指定的服务器
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1){
perror("cannot connect to the server");
close(connect_fd);
return 1;
}
int size = 1024;
//用户输入信息后,程序将输入的信息通过套接字发送给服务器
//然后调用read函数从服务器中读取发送来的消息
while(1){
write(STDOUT_FILENO,"请输入需要的操作:",27);
bzero(snd_buf,size);
len=read(STDIN_FILENO,snd_buf,1024);
if(len>0){
write(connect_fd,snd_buf,strlen(snd_buf) + 1);
}
len=read(connect_fd,snd_buf,size);
if(len>0)
printf("服务器返回的结果:%s,长度为:%d\n",snd_buf, len);
}
close(connect_fd);
return 0;
}
程序运行:
#./server 5000
#./client 192.168.1.124 5000
IP写你自己服务器的IP
相关文章推荐
- 基于TCP的socket通信,实现加减乘除和文件写入(方法二)
- Java Socket应用(五)——编程实现基于 TCP 的 Socket 通信
- Java 基于 TCP/IP 实现 Socket中的多客户端通信
- 基于socket通信的,利用MFC实现TCP通信的C/S架构程序
- Socket编程——基于TCP实现自己的通信协议
- linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
- Android Socket编程基于TCP实现客户端与服务器简易通信
- linux下第一个socket编程实现的局域网内通信(基于TCP)
- linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
- Socket——基于TCP通信的实现
- 轨迹系列——Socket总结及实现基于TCP或UDP的809协议方法
- Java 基于 TCP/IP 实现 Socket中的多客户端通信
- Java Socket(四)编程实现基于 TCP 的 Socket 通信
- unity基于TCP的socket通信实现“群聊”功能
- java分布式开发TCP/IP NIO无阻塞 Socket((基于消息方式实现系统间的通信) )(转)
- socket编程 -- 基于TCP协议的C/S通信模型及实现
- 基于TCP/IP的SOCKET接口实现网络通信
- Java 基于TCP/IP 实现简单的 socket 通信
- 基于TCP和UDP的socket通信(C++实现)
- Java 基于TCP/IP 实现简单的 socket 通信