《UNIX网络编程》TCP客户端服务器例子
最近在看《UNIX网络编程》(简称unp)和《Linux程序设计》,对于unp中第一个获取服务器时间的例子,实践起来总是有点头痛的,因为作者将声明全部包含在了unp.h里,导致后面编写代码会对这个头文件造成依赖,而学习不到调用了相应功能之后,应该包含哪些确切的头文件。
再者,我下载了unp.h之后,头文件包含再次产生了其他的依赖缺失,因此便参考了《Linux程序设计》中socket一章的入门例子的头文件包含,并且编译中仍然找不到的包含或者是宏定义在unp.h中搜索并粘贴进来,从而不需要再包含类似unp.h之类的自定义头文件。
以下代码在root权限下运行,因为使用的端口号13对于非root用户可能会无权访问。
unp原书中服务器获取机器时间送回客户端,但我在运行中,字符串保存到buffer区的函数snprintf()总是造成了内存错误而中断,所以本着入门的目的,改为了复制一句话到buffer中。
/*client.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#define MAXLINE 4096
#define PORT 13
#define SA struct sockaddr
int main(int argc, char *argv[])
{
int sockfd, n;
];
struct sockaddr_in servaddr;
) {
fprintf(stderr, "usage: client <IP>\n");
exit();
}
)) < ) {
fprintf(stderr, "socket error\n");
exit();
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
], &servaddr.sin_addr) <= ) {
fprintf(stderr, ]);
exit();
}
) {
fprintf(stderr, "connect error\n");
exit();
}
) {
recvline[n] = ;
if (fputs(recvline, stdout) == EOF) {
fprintf(stderr, "fputs error\n");
exit();
}
}
) {
fprintf(stderr, "read error\n");
exit();
}
exit();
}
/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#define MAXLINE 4096
#define LISTENQ 1024
#define PORT 13
#define SA struct sockaddr
int main(int argc, char *argv[])
{
int listenfd, connfd;
struct sockaddr_in servaddr;
];
time_t t;
listenfd = socket(AF_INET, SOCK_STREAM, );
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
listen(listenfd, LISTENQ);
) {
connfd = accept(listenfd, (SA *)NULL, NULL);
/* write something to buff[]*/
strcpy(buff, "this is a message\n");
write(connfd, buff, strlen(buff));
close(connfd);
}
exit();
}
编译文件:
$ gcc client.c -o client $ gcc server.c -o server
在一个窗口中运行服务器:
$ ./server
在另一个窗口运行客户端,从而显示出一句话"this is a message":
$ ./client 127.0.0.1
《UNIX网络编程》TCP客户端服务器例子的更多相关文章
- UNIX网络编程---TCP客户/服务器程序示例(五)
一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...
- [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]
[网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...
- UNIX网络编程——TCP回射服务器/客户端程序
下面通过最简单的客户端/服务器程序的实例来学习socket API. serv.c 程序的功能是从客户端读取字符然后直接回射回去: #include<stdio.h> #include&l ...
- unix网络编程——TCP套接字编程
TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- Linux网络编程:客户端/服务器的简单实现
一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...
- 第5章-unix网络编程 TCP/服务端程序示例
这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的 客户端代码 #include "unp. ...
- UNIX网络编程——tcp流协议产生的粘包问题和解决方案
我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...
- python网络编程--TCP客户端的开发
#导入socket模块 2 import socket 3 #参数说明 4 """ 5 socket类的介绍 6 创建客户端socket对象 7 socket.socke ...
随机推荐
- mysql事物处理
mysql事物主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你既要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等.这样,这些数据库操作语句就构成一个事 ...
- AngularJS 之Services讲解
Angular带来了很多类型的services.每个都会它自己不同的使用场景.我们将在本节来阐述. 首先我们必须记在心里的是所有的services都是singleton(单例)的,这也是我们所希望得到 ...
- Max Sum(hd P1003)
Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...
- Redis存储Session
net Core 使用Redis存储Session 前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(m ...
- SQL Server 锁的 8 种类型
第1种. 共享锁.由读取查寻产生. 第2种. 意向锁.用意向锁来表示有将要获得某一资源的意向. 第3种. 更新锁.在修改数据前获得. 第4种. 排它锁.用于独占某一资源时获得. 第5种. 架构锁.运行 ...
- WPF 接收exe传的值
原文:WPF 接收exe传的值 一,首先重载APP protected override void OnStartup(StartupEventArgs e) { ...
- haproxy hdr和path
path : string This extracts the request's URL path, which starts at the first slash and ends before ...
- linux下修改ip地址,默认网关以及DNS
*修改IP地址 即时生效: ifconfig eth0 192.168.1.100 netmask 255.255.255.0 重启生效: vim /etc/sysconfig/network-s ...
- linux之SQL语句简明教程---HAVING
那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些店的营业额有超过 $1,500.在这个情况下,我们不能使用 WHERE 的指令.那要怎么办呢?很幸运地,SQL 有提供一个 HAV ...
- hdu 5615 Jam's math problem(判断是否能合并多项式)
方法一:由十字相乘相关理论我们能知道,如果要有p,k,q,m,那么首先要有解,所以b*b-4*a*c要>0,然而因为p,k,q,m是正整数,所以代表x1,x2都是有理数,有理数是什么鬼呢?就是解 ...