TCP编程之一

一、基本模型(多进程\多线程)

apue.h  /usr/include 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <errno.h>
 5 #include <sys/wait.h>
 6 #include <sys/ioctl.h>
 7 #include <sys/types.h>
 8 #include <fcntl.h>
 9 #include <pthread.h>
10 #include<netinet/in.h>
11 #include <arpa/inet.h>
12 #include <signal.h>
13 #include <sys/socket.h>
14 #include <string.h>
15
16 #define ERR(msg) do{    17     fprintf(stderr,"[%s:%d] %s:%s\n",__FILE__,__LINE__,msg,strerror(errno));18     exit(-1);    19 }while(0)
20
21 #define STREQ(s1,s2) (strcmp(s1,s2)==0)
22 #define MAXER(n1,n2) ((n1)>(n2)?(n1):(n2))
23 #define MINOR(n1,n2) ((n1)<(n2)?(n1):(n2))
24 #define CLEAR(n) (memset(&n,0,sizeof(n)))

echoserver.c 

  1 #include <apue.h>
  2
  3 #define PORT 8080
  4 #define IP "192.168.5.99"
  5 #define BACKLOG 10
  6
  7 void *routine(void *arg);
  8 void do_business();
  9
 10 int main(int argc, char **argv)
 11 {
 12     int sockfd;
 13     //1.创建socket
 14     if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
 15         ERR("Socket failed");
 16
 17     int val = 1;
 18     if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val))<0)
 19         ERR("set reuseaddr failed");
 20 #ifdef SO_REUSEPORT
 21     if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEPORT,&val,sizeof(val))<0)
 22         ERR("set reuseaddr failed");
 23 #endif
 24
 25 #if 0
 26     struct sockaddr_in {
 27         sa_family_t sin_family;
 28         in_port_t sin_port;
 29         struct in_addr sin_addr;
 30         unsigned char sin_zero[8];
 31     };
 32 #endif
 33     //2.给socket绑定地址
 34     struct sockaddr_in ipv4, peer;
 35     ipv4.sin_family = AF_INET;
 36     ipv4.sin_port = htons(PORT);    //NBO
 37     inet_pton(AF_INET, IP, &ipv4.sin_addr);    //NBO
 38     memset(ipv4.sin_zero, 0, sizeof(ipv4.sin_zero));
 39     if (bind(sockfd, (struct sockaddr *) &ipv4, sizeof(ipv4)) < 0)
 40         ERR("bind failed");
 41
 42     //3.监听
 43     if (listen(sockfd, BACKLOG) < 0)
 44         ERR("listen failed");
 45
 46     //4.接收连接
 47     socklen_t len = sizeof(peer);    //value-result argument
 48     int connfd;
 49     for (;;) {
 50         if ((connfd = accept(sockfd, (struct sockaddr *) &peer, &len)) < 0)
 51             ERR("accept failed");
 52
 53         unsigned short peerport = ntohs(peer.sin_port);
 54         char ipstr[] = "ddd.ddd.ddd.ddd";
 55         inet_ntop(AF_INET, &peer.sin_addr, ipstr, sizeof(ipstr));
 56
 57         //5.通信
 58         char banner[255];
 59         sprintf(banner, "[%s:%d] welcome to echoserver!", ipstr,
 60             peerport);
 61         printf("Accept a new Connection: %s,%d\n",ipstr,peerport);
 62         if(write(connfd, banner, strlen(banner)) < strlen(banner))
 63             ERR("write failed");
 64
 65 #ifdef MODEL_THREAD
 66         pthread_t tid;
 67         if(pthread_create(&tid,NULL,routine,(void*)connfd))
 68             ERR("create thread failed");
 69 #elif MODEL_FORK
 70         pid_t pid;
 71         if((pid = fork())<0)
 72             ERR("fork failed");
 73         else if(pid==0)
 74         {
 75             close(sockfd);        //1.关闭无用描述符
 76             do_business(connfd);
 77             exit(0);            //2.显式指定退出
 78         }
 79         close(connfd);
 80 #endif
 81     }
 82     //7.关闭服务器
 83     close(sockfd);
 84     return 0;
 85 }
 86
 87 void do_business()
 88 {
 89     sleep(20);
 90 }
 91
 92 void *routine(void *arg)
 93 {
 94     int connfd = (int)arg;
 95     char buf[255];
 96     int n;
 97     while(1)
 98     {
 99         if((n = read(connfd,buf,sizeof(buf)))<0)
100             ERR("read failed");
101         else if(n==0)
102         {
103             printf("Connection is closed by peer!\n");
104             goto end;
105         }
106         if(write(connfd,buf,n)<0)
107             ERR("write failed");
108     }
109 end:
110     close(connfd);
111     return NULL;
112 }

 

 echoclient.c  

 1 #include <apue.h>
 2
 3 void do_business(int sockfd);
 4
 5 int main(int argc,char **argv)
 6 {
 7     //1.判断命令行
 8     if(argc!=3)
 9     {
10         printf("Usage: %s <host> <port>\n",argv[0]);
11         exit(0);
12     }
13     char *ipstr = argv[1];
14     unsigned short port = strtol(argv[2],NULL,10);
15
16     //2.socket
17     int sockfd;
18     if((sockfd = socket(PF_INET,SOCK_STREAM,0))<0)
19         ERR("socket failed");
20
21     //3.connect
22     struct hostent *ent;
23     if((ent=gethostbyname(ipstr))==NULL)
24         ERR("gethostbyname failed");
25
26     struct sockaddr_in peer;
27     CLEAR(peer);
28     peer.sin_family = AF_INET;
29     peer.sin_port = htons(port);
30     //inet_pton(AF_INET,ipstr,&peer.sin_addr);
31     memcpy(&peer.sin_addr,ent->h_addr,sizeof(struct in_addr));
32     if(connect(sockfd,(struct sockaddr*)&peer,sizeof(peer))<0)
33         ERR("connect failed");
34
35     //4.交互
36     char banner[255];
37     int n;
38     if((n = read(sockfd,banner,sizeof(banner)))<0)
39         ERR("read failed");
40     else if(n==0)
41         goto end;
42     banner[n] = 0;
43     printf("%s\n",banner);
44
45     do_business(sockfd);
46
47     //5.关闭
48 end:
49     close(sockfd);
50
51     return 0;
52 }
53
54 void do_business(int sockfd)
55 {
56     int n;
57     char buf[255],msg[255];
58     while(1)
59     {
60         printf("shell# ");
61         fflush(stdout);
62         scanf("%s",buf);
63         if(write(sockfd,buf,strlen(buf))<0)
64             ERR("write failed");
65         if((n = read(sockfd,msg,sizeof(msg)))<0)
66             ERR("read failed");
67         else if(n==0)
68             break;
69         msg[n] = 0;
70         printf("%s\n",msg);
71     }
72 }

 Makefile  

CC = gcc
CPPFLAGS = -DMODEL_THREAD
CFLAGS = -Wall -g
LDFLAGS =  -lpthread

TARGETS = echoserver echoclient

all:$(TARGETS)

clean:
    $(RM) $(TARGETS)

.PHONY: all clean

TCP编程之一

时间: 2024-10-11 12:06:58

TCP编程之一的相关文章

【Socket编程】通过Socket实现TCP编程

通过Socket实现TCP编程 Socket通信 : 1.TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器端----ServerSocket类 一.通信过程(Socket通信模型) Socket通信模型用下图所示: 1.在服务端建立一个ServerSocket,绑定相应的端口,并且在指定的端口进行侦听,等待客户端的连接. 2.当客户端创建连接Socket并且向服务端发送请求. 3.服务器收到请求,并且接

基于Socket的UDP和TCP编程介绍

一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(streamsocket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户—服务器程序设计基本框架 说明:(三路握手)         1.客户端发

TCP编程,Socket通讯

网络编程分两种,一种是TCP编程,还有一种是UDP编程(点击打开链接).而本文先讲述简单的TCP编程,Socket套接字连接通讯,实现简单的client与server之间的信息传输. 以下是client与server之间简单的传输数据(单对单): 注意:服务端先启动.然后再启动client. client: public class C { public static void main(String[] args) { try { Socket s = new Socket("172.18.1

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接

九、Socket之TCP编程

TCP简介 TCP是Transmission Control Protocol(传输控制协议)的简称,是TCP/IP体系中面向连接的运输层协议,在网络中提供全双工的和可靠的服务. TCP最主要的特点: (1)是面向连接的传输层协议: (2)每个TCP连接只能有两个端点,而且只能一对一通信,不能一点对多点直接通信. (3)通过TCP连接传送的数据,能保证数据无差错.不丢失.不重复地准确到达接收方,并且保证各数据到达的顺序与数据发出的顺序相同. (4)数据以字节流的方式传输. (5)传输的数据无消息

网络编程之TCP编程

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

python中的TCP编程学习

今天看了一下关于python的TCP编程. 发现思路和其他语言(比如java)思路基本上差点儿相同. 先看client.基本过程例如以下: 第一步:创建一个socket 第二步:建立连接 第三步:发送数据 第四步:读取从server发送过来的数据 第五步:关闭连接 第六步:对收到的数据进行处理 以下为python的TCP编程的client程序的一个小样例.java中关于网络编程的博文请看这里 #coding:utf-8 #TCP编程的client程序 #编写client程序与其他语言(比如jav

基于 Socket 的 UDP 和 TCP 编程介绍

基于 Socket 的 UDP 和 TCP 编程介绍 一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(stream socket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户-服务器程序设计基本

Tcp编程常见问题及解决方法总结

问题1.粘包问题 解决方法一:TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满: 解决方法二:发送固定长度的消息 解决方法三:把消息的尺寸与消息一块发送 解决方法四:双方约定每次传送的大小 解决方法五:双方约定使用特殊标记来区分消息间隔 解决方法六:标准协议按协议规则处理,如Sip协议 问题2.字符串编码问题 将中文字符串用utf8编码格式转换为字节数组发送时,一个中文字符可能会占用2-4个字节(假设为3个字节),这3个