linux网络编程--tcp/udp编程模型

tcp 模型如下:

上面的模型已经很清楚了

具体函数用法就不细说了

请看tcp简单的例子:

其中server.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define err_log(errlog) do{perror(errlog); exit(1);}while(0)
#define N 128

// ./server 192.168.0.196 10000

int main(int argc, const char *argv[])
{
  int sockfd;
  int confd;
  struct sockaddr_in serveraddr, clientaddr;
  char buf[N] = {};

if(argc != 3)
{
fprintf(stderr, "Usage:%s serverip port.\n", argv[0]);
return -1;
}

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
err_log("fail to socket");
}

printf("sockfd = %d\n", sockfd);

serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));

if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
err_log("fail to bind");
}

if(listen(sockfd, 10) < 0)
{
err_log("fail to listen");
}

socklen_t addrlen = sizeof(struct sockaddr);
if((confd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen)) < 0)
{
err_log("fail to accept");
}

printf("confd = %d , %s --> %d \n", confd , inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

while(1)
{
if(recv(confd, buf, N, 0) < 0)
{
err_log("fail to recv");
}
printf("From client:%s\n", buf);
if(strncmp(buf, "quit", 4) == 0)
{
break;
}
strcat(buf, " from server...");
if(send(confd, buf, N, 0) < 0)
{
err_log("fail to send.\n");
}
}

close(sockfd);

return 0;
}

其中client.c如下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define err_log(errlog) do{perror(errlog); exit(1);}while(0)
#define N 128

// ./client 192.168.0.196 10000

int main(int argc, const char *argv[])
{
  int sockfd;
  int confd;
  struct sockaddr_in serveraddr, clientaddr;
  char buf[N] = {0};

if(argc != 3)

{

fprintf(stderr, "Usage:%s serverip port.\n", argv[0]);

return -1;

}

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

{

err_log("fail to socket");

}

printf("sockfd = %d\n", sockfd);

serveraddr.sin_family = AF_INET;

serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

serveraddr.sin_port = htons(atoi(argv[2]));

if(connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)

{

err_log("fail to connect");

}

while(1)

{

printf("Input >");

fgets(buf, N, stdin);

buf[strlen(buf)-1] = ‘\0‘;

if(send(sockfd, buf, N, 0) < 0)

{

err_log("fail to send");

}

if(strncmp(buf, "quit", 4) == 0)

{

break;

}

if(recv(sockfd, buf, N, 0) < 0)

{

err_log("fail to recv");

}

printf("%s\n", buf);

}

close(sockfd);

return 0;

}

udp模型如下

其中server.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define err_log(errlog) do{perror(errlog); exit(1);}while(0)
#define N 128

int main(int argc, const char *argv[])
{
int sockfd;
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
socklen_t addrlen = sizeof(clientaddr);
char buf[N] = {};

if(argc < 3)
{
fprintf(stderr, "usage:%s serverip port.\n", argv[0]);
return -1;
}

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
err_log("fail to socket");
}

serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));

if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
err_log("fail to bind");
}

while(1)
{
if(recvfrom(sockfd, buf, N, 0, (struct sockaddr*)&clientaddr, &addrlen) < 0)
{
err_log("fail to recvfrom");
}

printf("From clientaddr:%s\n", buf);
strcat(buf, " from server...");

if(strncmp(buf, "quit", 4) == 0)
{
break;
}

if(sendto(sockfd, buf, N, 0, (struct sockaddr *)&clientaddr, addrlen) < 0)
{
err_log("fail to sendto");
}

}

close(sockfd);

return 0;
}

其中client.c 如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define err_log(errlog) do{perror(errlog); exit(1);}while(0)
#define N 128

int main(int argc, const char *argv[])
{
int sockfd;
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
socklen_t addrlen = sizeof(clientaddr);
char buf[N] = {};

if(argc < 3)
{
fprintf(stderr, "usage:%s serverip port.\n", argv[0]);
return -1;
}

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
err_log("fail to socket");
}

serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));

while(1)
{
printf("Input > ");
fgets(buf, N, stdin);
buf[strlen(buf)-1] = ‘\0‘;

if(sendto(sockfd, buf, N, 0, (struct sockaddr *)&serveraddr, addrlen) < 0)
{
err_log("fail to sendto");
}

if(strncmp(buf, "quit", 4) == 0)
{
break;
}

if(recvfrom(sockfd, buf, N, 0, NULL, NULL) < 0)
{
err_log("fail to recvfrom");
}

printf("%s\n", buf);

}

close(sockfd);

return 0;
}

原文地址:https://www.cnblogs.com/bwbfight/p/9303656.html

时间: 2024-10-09 21:11:49

linux网络编程--tcp/udp编程模型的相关文章

TCP/UDP编程中的问题汇总

TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到发送完成. 最后,再发送完成标记. 接收端: 接收到第一个包时,得到文件的大小等信息. 计算出要接收多少个包. 然后,循环接收包,并将接收到的数据写入到文件中. 直到,接收到的数据长度等于文件的大小. struct package { 文件标识 //GUID 偏移量 //001- 数据段 //Byt

网络编程之UDP编程

网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送和接受数据报.值得注意的是:UDP编程必须先由客户端发出信息.一个客户端就是一封信,Socket相当于美国式邮筒(信件的收发都在一个邮筒中).端口与协议相关,所以TCP的30

网络基础---TCP/IP五层模型

网络基础---TCP/IP五层模型 计算机之间的通讯是通过互联网来进行的,各个计算机在internet上遵循它的一系列协议才能进行通讯,因此实际上可以把互联网本质看作是一系列的网络协议. 1.TCP/IP五层模型 (1)物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0 (2)数据链路层的功能:建立逻辑连接.进行硬件地址寻址.差错校验等功能(由底层网络定义协议).并且将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正. 1)以广播的方式通

Linux学习四:UDP编程(上)

关于UDP和TCP对比优缺,这里就不说了. 使用UDP代码所掉用的函数和用于TCP的函数非常类似,这主要因为套接口库在底层的TCP和UDP的函数上加了一层抽象,通过这层抽象使得编程更容易,但失去了一些控制. 二者函数调用唯一的实际区别是soceket函数调用的一个参数,TCP的是SOCK_STREAM,UDP的是SOCK_DGRAM,二者都可以使用recvfrom函数,而recv只用于TCP. 当然函数的变化不是这么简单,因为你要从一种有连接的协议转向到无连接的协议上去.这里写个很简单直接的UD

winsocket之TCP/UDP编程

一.概述: 本次练习的是TCP/UDP套接字编程,使用的是winsocket,对主要的库函数进行简绍,并实现了一个程序:实现服务器与客户端之间的通信,在服务器端实现记录用户名和密码,客服端可以实现用户名和密码的输入和查找,并且检查是否匹配.(参考  <<Visual C++网络编程>>) PS: 127.0.0.1是回路地址,用于在同一台机器上测试代码.端口号要大于1024. 二.基于TCP/UDP协议的套接字编程详解: 基于 TCP 的套接字编程的所有客户端和服务器端都是从调用s

3socket编程:UDP编程

 1 C/S模型-UDP UDP处理模型 说明: 由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实现. 编译运行server,在两个终端里各开一个client与server交互,看看server是否具有并 发服务的能力.用Ctrl+C关闭server,然后再运行server,看此时client还能否和server联 系上.和前面TCP程序的运行结果相比较,体会无连接的含义. 2 案例说明: Server.c #includ

python 网络通信协议/TCP,UDP区别

一.osi七层协议 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 协议具体内容 各层的功能简述: [1]物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换),这一层的数据叫做比特. [2]数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问,这一层通常还提供错误检测和纠正,以确保数

python 学习5 网络编程-TCP/UDP

摘抄自:廖雪峰的官方网站:http://www.liaoxuefeng.com/ TCP客户端和服务器端代码: #coding=utf-8 #客户端程序TCP 连接 import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('127.0.0.1',9999)) print(s.recv(1024)) for data in ['Michael','Tracy','Sarah']: s.send(data

Socket编程(TCP/UDP) - 初学(C语言)

Socket socket函数 TCP代码实现 TCP Server TCP Client UDP代码实现 UDP Server UDP Client Socket 先介绍一下socket的启动过程: 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态. (2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器