TCP UDP IP 网络编程

一、查看while源代码

(1)基础知识

1.TCP

TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

2.嵌套字

套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。

(2)函数调用

1.socket

int socket(int domain, int type,int protocol)

参数 解释 用法
domain 网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等) AF_UNIX只能够用于单一的Unix 系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程主机之间通信(当我们 man socket时发现 domain可选项是 PF_而不是AF_,因为glibc是posix的实现所以用PF代替了AF,不过我们都可以使用的).
type 网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等) SOCK_STREAM表明使用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流.SOCK_DGRAM 表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信.
protocol 由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了

2.bind

int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
参数 解释
sockfd 由socket调用返回的文件描述符
addrlen sockaddr结构的长度
my_addr sockaddr结构的长度

3.listen

int listen(int sockfd,int backlog)
参数 解释
sockfd 是bind后的文件描述符
backlog 设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长

4.accept

int accept(int sockfd, struct sockaddr *addr,int *addrlen)
参数 解释
sockfd
addr/addrlen 是用来给客户端的程序填写的,服务器端只要传递指针就可以了

5.connect

int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
参数 解释
sockfd socket返回的文件描述符
serv_addr 储存了服务器端的连接信息.其中sin_add是服务端的地址
addrlen serv_addr的长度

二、编译并在ubuntu下运行

编译

gcc -o server-while-tcp.out server-while-tcp.c
gcc -o client.out client.c

运行

./server-while-tcp.out
./client.out 192.168.1.***     //新的窗口打开

三、.修改服务器为多线程模式

server(服务器端)源码

#include <sys/types.h>      /* 网络编程所需头文件*/
#include <sys/socket.h>     /* 网络编程所需头文件*/
#include <string.h>
#include <netinet/in.h>     /* 包含类似inet_ntoa函数的头文件 */
#include <arpa/inet.h>      /* 包含类似inet_ntoa函数的头文件 */
#include <unistd.h>         /* 包含close函数、forck函数等系统调用函数的头文件 */
#include <stdio.h>      
#include <signal.h>         /* 包含signal函数的头文件 */

#define SERVER_PORT 8888        /* 监听端口号 */
#define BACKLOG 10              /* listen函数中最大同时监听连接路数 */

/* socket              
 * bind 
 * listen
 * accept
 * send/recv
*/
int charup(unsigned char ch[1000]);

int main(int argc, char **argv)
&#123;
    int iSocketServer;
    int iSocketClient;
    struct sockaddr_in tSocketServerAddr;   /* 存放服务器端的通讯协议族、要监听的端口号等信息的结构体 */
    struct sockaddr_in tSocketClientAddr;   /* 存放连接的客户端的IP地址等信息的结构体 */
    int iRet;
    int iAddrLen;
        
    int iRecvLen;
    unsigned char ucRecvBuf[1000];

    int iClientNum = -1;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值