linux c server and client 简单的通信

server.c

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

int main(int argc, char *argv[])

{

int sockfd,new_fd;

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

int sin_size,portnumber;

char hello[1000]="Hello! Are You Fine?\n";

if(argc!=2)

{

fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);

exit(1);

}

if((portnumber=atoi(argv[1]))<0)

{

fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);

exit(1);

}

/* 服务器端开始建立socket描述符 */

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

fprintf(stderr,"Socket error:%s\n\a",strerror(errno));

exit(1);

}

/* 服务器端填充 sockaddr结构  */

bzero(&server_addr,sizeof(struct sockaddr_in));

server_addr.sin_family=AF_INET;

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

server_addr.sin_port=htons(portnumber);

/* 捆绑sockfd描述符  */

if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

{

fprintf(stderr,"Bind error:%s\n\a",strerror(errno));

exit(1);

}

/* 监听sockfd描述符  */

if(listen(sockfd,5)==-1)

{

fprintf(stderr,"Listen error:%s\n\a",strerror(errno));

exit(1);

}

while(1)

{

/* 服务器阻塞,直到客户程序建立连接  */

sin_size=sizeof(struct sockaddr_in);

if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)

{

fprintf(stderr,"Accept error:%s\n\a",strerror(errno));

exit(1);

}

fprintf(stderr,"Server get connection from %s\n",

inet_ntoa(client_addr.sin_addr));

fscanf(stdin,"%s",hello);

if(write(new_fd,hello,strlen(hello))==-1)

{

fprintf(stderr,"Write Error:%s\n",strerror(errno));

exit(1);

}

/* 这个通讯已经结束     */

close(new_fd);

/* 循环下一个     */

}

close(sockfd);

exit(0);

}

client.c

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

int main(int argc, char *argv[])

{

int sockfd;

char buffer[1024];

struct sockaddr_in server_addr;

struct hostent *host;

int portnumber,nbytes;

if(argc!=3)

{

fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);

exit(1);

}

if((host=gethostbyname(argv[1]))==NULL)

{

fprintf(stderr,"Gethostname error\n");

exit(1);

}

if((portnumber=atoi(argv[2]))<0)

{

fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);

exit(1);

}

/* 客户程序开始建立 sockfd描述符  */

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));

exit(1);

}

/* 客户程序填充服务端的资料       */

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(portnumber);

server_addr.sin_addr=*((struct in_addr *)host->h_addr);

/* 客户程序发起连接请求         */

if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

{

fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));

exit(1);

}

/* 连接成功了           */

if((nbytes=read(sockfd,buffer,1024))==-1)

{

fprintf(stderr,"Read Error:%s\n",strerror(errno));

exit(1);

}

buffer[nbytes]=‘\0‘;

printf("I have received:%s\n",buffer);

/* 结束通讯     */

close(sockfd);

exit(0);

}

Makefile

all:server client

server:server.c

gcc $^ -o [email protected]

client:client.c

gcc $^ -o [email protected]

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-04 19:47:15

linux c server and client 简单的通信的相关文章

解决Linux 下server和client 通过TCP通讯:accept成功接收却报错的问题

今天在写简单的TCP通讯例子的时候,遇到了一个问题:server 和client能够连接成功,并且client也能够正常发送,但server就是接收不到,在网上搜索一番后,终于解决了问题.在这里整理如下: 大家要注意的是,一个server端可以连接多个client端,server端的accept()函数负责等待并接收client的连接请求,而且accept()函数将不同client端的sockfd作为返回值.为了保证接收到对应的client端数据,所以在client连接成功且使用recv()函数

应用java多线程实现server端与多client之间的通信

应用多线程来实现server与多线程之间的通信的基本步骤 1.server端创建ServerSocket,循环调用accept()等待client链接 2.client创建一个Socket并请求和server端链接 3.server端接受client请求,创建socekt与该client建立专线链接 4.建立链接的socket在一个单独的线程上对话 5.server继续等待新的链接 server端Server.java package test.concurrent.socket; import

(填坑系列) 用aio写server与client进行通信的坑

最近闲来无事,就估摸着自己写个“服务注册中心”来玩,当然因为是个人写的,所以一般都是简洁版本. 代码地址在:https://gitee.com/zhxs_code/my-service-register.git 由于在处理与网络数据时,为了性能,想到用AIO来实验,结果发现AIO整个思路与之前的BIO,NIO都不一样.导致出现一些深坑,在此记录一下. (一)  AIO写的server端与client端,只能通信一次. 上代码: server端部分: 1 public class Register

C语言 linux环境基于socket的简易即时通信程序

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下: head.h 1 /*头文件,client和server编译时都需要使用*/ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys

LVS Load Balancing Linux Virtual Server

简介:Linux虚拟服务器(Linux Virtual Server. LVS),是一个由章文松开发的自由软件.利用KVS可以实现高可用的.可伸缩缩的Web, Mail, Cache和Medial等网络股务..井在此基 础上开发支持庞大用户数的,可伸缩的,高可用的电子商务应用.LVS1998年发展到现在,已经变得比较成熟,目前广泛应用在各种网络服务和电了商务应用 中.LVS具有很好的伸缩缩性.可靠性和管埋性,通过LVS要实现的最终目标是:利用linux 操作系统和LVS集群软件实现一个高可用.高

ubuntu下mysql安装(server、client、dev),开启、停止和重启,及常见错误

1. 在ubuntu下安装server和client很简单: (1)安装server apt-get install mysql-server 安装当中,会提示输入root账户的密码,按提示输入即可. 安装后默认开启了server (2) 安装client apt-get install mysql-client 2. 安装mysql的c语言开发接口 apt-get install libmysqlclient15-dev 3. 开启.关闭.重启 一.启动 1.使用 service 启动:ser

Winsock网络编程笔记(3)----基于UDP的server和client

在上一篇随笔中,对Winsock中基于tcp面向连接的Server和Client通信进行了说明,但是,Winsock中,Server和Client间还可以通过无连接通信,也就是采用UDP协议.. 因此,这一篇随笔也简单的列举基于UDP的Server和Client的实现.. 和基于TCP的实现相比,其主要的不同点包括: ①接收端(简单地说就是服务器)/发送端(简单地说就是客户端)在创建Socket时候,参数要选择SOCK_DGRAM, IPPROTO_UDP: ②接收端不需要调用listen和ac

shell 脚本实战笔记(11)--Mysql在linux下的安装和简单运维

前言: linux中安装mysql以及配置的管理, 基础的运维和管理还是需要会一些的. 这边作下笔记, 以求天天向上(^_^). 安装流程:*). 安装mysql-server1). 借助yum检索相关的mysql rpm包yum search mysqlmysql-server.x86_64 正是我们想要的 2). 安装mysql-serveryum install mysql-server.x86_64 -y默认mysql-client也安装好 3). 启动mysql服务/etc/init.

Linux LVS(Linux virtual server)V1.26 负载均衡 详细配置教程

2 Linux LVS(Linux virtual server)V1.26 负载均衡 配置思路: 安装LVS服务器 在LVS服务器上安装kernel 链接内核文件 并手动绑定VIP 配置realserver后端服务,手动执行VIP绑定脚本 2.1 LVS 概念 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分