C语言学习之Linux下TCP服务器与客户端的实现

客户端代码如下:

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define portnumber 3333

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

{

int sockfd;

char buffer[1024];

struct sockaddr_in server_addr;

struct hostent *host;

/* 使用hostname查询host 名字 */

if(argc!=2)

{

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

exit(1);

}

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

{

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

exit(1);

}

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

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP

{

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

exit(1);

}

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

bzero(&server_addr,sizeof(server_addr)); // 初始化,置0

server_addr.sin_family=AF_INET;          // IPV4

server_addr.sin_port=htons(portnumber);  // (将本机器上的short数据转化为网络上的short数据)端口号

server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址

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

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

{

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

exit(1);

}

/* 连接成功了 */

printf("Please input char:\n");

/* 发送数据 */

fgets(buffer,1024,stdin);

send(sockfd,buffer,strlen(buffer),0);

/* 结束通讯 */

close(sockfd);

exit(0);

}

服务器代码如下:

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define portnumber 3333//服务器的端口号和客户端的端口号一定相等

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

{

int sockfd,new_fd;

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

int sin_size;

int nbytes;

char buffer[1024];

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

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:IPV4;SOCK_STREAM:TCP

{

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

exit(1);

}

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

bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0

server_addr.sin_family=AF_INET;                 // Internet

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);  // (将本机器上的long数据转化为网络上的long数据)和任何主机通信  //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP

server_addr.sin_port=htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

/* 捆绑sockfd描述符到IP地址 */

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

{

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

exit(1);

}

/* 设置允许连接的最大客户端数 */

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)); // 将网络地址转换成.字符串

//if((nbytes=read(new_fd,buffer,1024))==-1) //此处可以写为if((nbytes=recv(new_fd,buffer,1024,0))==-1)

if((nbytes=recv(new_fd,buffer,1024,0))==-1)

{

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

exit(1);

}

buffer[nbytes]=‘\0‘;

printf("Server received %s\n",buffer);

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

close(new_fd);

/* 循环下一个 */

}

/* 结束通讯 */

close(sockfd);

exit(0);

}



时间: 2024-10-09 23:49:13

C语言学习之Linux下TCP服务器与客户端的实现的相关文章

windows下TCP服务器和客户端的实现

服务器 1.初始化 WSAStartup(..) 2.创建Socket s = Socket ( .. ) 3.绑定端口 ret = bind ( ... ) 4.监听 ret = listen ( .. ) 5.接收客户端的连接请求 s_new = accept ( ... )   // 三次握手发生在这个过程 6.收发数据 ret = recv ( .. ) // 阻塞模式, 内存不够存放发送的信息时,则阻塞send() // 非阻塞 , 视缓冲空间大小而发送相应大的数据,不阻塞send()

【Linux学习】Ubuntu下 samba服务器搭建

1.安装samba,smbfs 2.配置smb.conf文件 配置文件之前需要先备份一下需要配置的文件(养成好的习惯) 输入命令: 进入到smb.conf文件中,在文件的最后添加下列语句 保存后,退出. 3.启动服务 4.现在在samba共享的文件夹下有一下文件 然后通过windows访问共享目录,输入 \\172.16.42.6后看到共享的temp文件夹, [Linux学习]Ubuntu下 samba服务器搭建,布布扣,bubuko.com

linux下svn服务器的搭建

网上的教程实在是太恶心了,不是太老,就是有问题,刚参考的一篇文章也有问题.自己记录下来,以后用就方便了,现在一边重新安装一遍,一边记录.笔者亲测,今天是5月29号深夜. linux用的是centos6.2,yum install subversion,安装svn服务端.本篇操作均为root用户权限. 1.建立svn库目录. mkdir -p /opt/svndata/repos1 2.建立版本库 svnadmin create /opt/svndata/repos1 3.修改配置文件 (1)服务

Linux下TCP网络编程与基于Windows下C#socket编程间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clos

数据库学习之--Linux下Mysql源码包安装

数据库学习之--Linux下Mysql源码包安装 系统环境: 操作系统:RedHat EL6 DB Soft:  Mysql 5.6.4-m7     Mysql 在linux下的安装方式有两种版本,一种为Binary(二进制),另外一种为Source(源码包),本文为Source Install方式. 1.安装前的准备 解压安装包 [[email protected] ~]$ ls mysql-5.6.4-m7  mysql-5.6.4-m7.tar.gz  mysql-5.6.4-m7.ta

Linux下Memcached服务器部署

操作系统:CentOS 6.x 64位 实现目的:安装部署Memcached服务器 一.防火墙设置 vi /etc/sysconfig/iptables #编辑防火墙配置文件,添加下面代码 -A INPUT -m state --state NEW -m tcp -p tcp --dport 11211 -j ACCEPT :wq! #保存退出 service iptables restart #最后重启防火墙使配置生效 二.关闭SELINUX vi /etc/selinux/config #S

Linux下TCP网络编程与基于Windows下C#socket编程之间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入 数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clo

Linux下Memcache服务器的安装

Linux下Memcache服务器的安装 环境需求: 安装Memcached需要libevent库的支持,所以请在安装Memcached之前检查有没有安装libevent.测试环境还需要PHP的支持,本文假设PHP已经安装到/usr/local/php目录下. 服务器端主要是安装memcache服务器端,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent. memcached下载地址:http://www.danga.com/memcached/

linux下dhcp服务器的架构与实现

一.实验原理 在linux系统下架构DHCP服务器,为网络中的主机动态获取ip地址. 二.地址规划 192.168.2.0网络动态分配地址 地址池192.168.2.200 192.168.2.240 子网掩码 255.255.255.0 网关 192.168.2.254 DNS指向 202.102.224.68 202.102.227.68 三.实验步骤 ① 挂载光驱,安装dhcp server vim /etc/sysconfig/network-scripts/ifcfg-eth0 mou