`

Linux C socket 编程之TCP

 
阅读更多

本文主要是,简单实现tcp连接的两个程序。本文编写,假设读者有socket 编程思想。熟悉C编程。

服务端:


#include <stdio.h>
#include <stdlib.h>

#include <sys/socket.h>
#include <netinet/in.h> //互联网地址族
#include <arpa/inet.h>
#include <netdb.h>

#include <ctype.h> //toupper (小写转化为大写)

int port =8000;

/*服务端*/
int main(int argc, char** argv) {

struct sockaddr_in sin;//struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。
struct sockaddr_in pin;
int sock_descriptor;// 套接口描述字
int temp_sock_descriptor;
int address_size;
char buf[16384];// 缓冲区大小

int i,len;

/*
*int socket(int domain, int type, int protocol);
* PF_INET, AF_INET: Ipv4网络协议
* PF_INET6, AF_INET6: Ipv6网络协议。
* type参数的作用是设置通信的协议类型,可能的取值如下所示:
   SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
   OOB: 在所有数据传送前必须使用connect()来建立连接状态。
   SOCK_DGRAM: 使用不连续不可靠的数据包连接。
   SOCK_SEQPACKET: 提供连续可靠的数据包连接。
   SOCK_RAW: 提供原始网络协议存取。
   SOCK_RDM: 提供可靠的数据包连接。
   SOCK_PACKET: 与网络驱动程序直接通信。
*/
//socket函数,向系统申请一个通信端口
sock_descriptor=socket(AF_INET,SOCK_STREAM,0);//IPV4 TCP协议
if(sock_descriptor== -1)//申请失败
{
perror("call to socket");
exit(1);
}

bzero(&sin,sizeof(sin));// 初始化 然后是设置套接字
sin.sin_family = AF_INET;//协议族,在socket编程中只能是AF_INET(TCP/IP协议族)
sin.sin_addr.s_addr=INADDR_ANY;//sin_addr存储IP地址,使用in_addr这个数据结构
//s_addr按照网络字节顺序存储IP地址
//in_addr32位的IPv4地址
sin.sin_port=htons(port);//存储端口号

//将套接字(sin) 跟端口(sock_descriptor)链接
if(bind(sock_descriptor,(struct sockaddr *)&sin,sizeof(sin)) ==-1)
{
perror("call to bind");
exit(1);
}
/*int PASCAL FAR listen( SOCKET s, int backlog);
   S:用于标识一个已捆绑未连接套接口的描述字。
   backlog:等待连接队列的最大长度。
* listen()仅适用于支持连接的套接口,如SOCK_STREAM类型的。
*/
if(listen(sock_descriptor,20) == -1) //在端口sock_descriptor监听
{
perror("call to listen");
exit(1);
}

printf("accepting connections \n");

while(1)
{ //用来监听的端口sock_descriptor
temp_sock_descriptor = accept(sock_descriptor,(struct sockaddr *)&pin, &address_size);
if(temp_sock_descriptor== -1)
{
perror("call to accept");
exit(1);
}

/*int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);
   s:一个标识已连接套接口的描述字。
   buf:用于接收数据的缓冲区。
   len:缓冲区长度。
   flags:指定调用方式。
*/

if(recv(temp_sock_descriptor,buf,16384,0) ==-1)
{
perror("call to recv");
exit(1);
}

printf("received from client:%s\n",buf);

len =strlen(buf);
for(i=0;i<len;i++)
{
buf[i]= toupper(buf[i]);//将小写字母转化为大写字母
}
/*int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
   s:一个用于标识已连接套接口的描述字。
   buf:包含待发送数据的缓冲区。
   len:缓冲区中数据的长度。
   flags:调用执行方式。*/

/*send() 基于链接的发送 TCP
*sendto() 基于无链接到 UDP
*/

if(send(temp_sock_descriptor,buf,len,0) == -1)
{
perror("call to send");
exit(1);
}

close(temp_sock_descriptor);

}

return (EXIT_SUCCESS);
}

客户端:

#include <stdio.h>
#include <stdlib.h>

#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
/*客户端*/
char *host_name ="127.0.0.1";//需要搜寻服务端IP地址
int port = 8000;

/*argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数
* argv: 字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数
  argv[0] 指向程序运行的全路径名
  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串
  argv[2] 指向执行程序名后的第二个字符串
*/
int main(int argc, char** argv) {
char buf[8192];
char message[256];
int socket_descriptor;
struct sockaddr_in pin;//处理网络通信的地址
/*
* hostent记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表
* struct hostent {
   char *h_name;地址的正式名称
   char **h_aliases;空字节-地址的预备名称的指针
   int h_addrtype;地址类型; 通常是AF_INET。
   int h_length;地址的比特长度。
   char **h_addr_list;零字节-主机网络地址指针。网络字节顺序。
   };
   #define h_addr h_addr_list[0] //h_addr_list中的第一地址
*/
struct hostent *server_host_name;

char *str = "A default test string";

if(argc<2)//运行程序时送给main函数到命令行参数个数
{
printf("Usage:test \"Any test string\"\n");
printf("we will send a default test string. \n");
}
else
{
str =argv[1];
}
/*
* gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的
* hostent结构指针。结构的声明与gethostaddr()中一致。*/
if((server_host_name = gethostbyname(host_name))==0)
{
perror("Error resolving local host \n");
exit(1);
}

bzero(&pin,sizeof(pin));
pin.sin_family =AF_INET;
//htonl()将主机的无符号长整形数转换成网络字节顺序
pin.sin_addr.s_addr=htonl(INADDR_ANY);//s_addr按照网络字节顺序存储IP地址
//in_addr 32位的IPv4地址 h_addr_list中的第一地址
pin.sin_addr.s_addr=((struct in_addr *)(server_host_name->h_addr))->s_addr;// 跟书上不一样 必须是h_addr

pin.sin_port=htons(port);
/*申请一个通信端口*/
if((socket_descriptor =socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("Error opening socket \n");
exit(1);
}
//pin 定义跟服务端连接的 IP 端口
if(connect(socket_descriptor,(void *)&pin,sizeof(pin))==-1)
{
perror("Error connecting to socket \n"); ////
exit(1);
}
printf("Sending message %s to server \n",str);

if(send(socket_descriptor,str,strlen(str),0) == -1)
{
perror("Error in send\n");
exit(1);
}

printf("..sent message.. wait for response...\n");

if(recv(socket_descriptor,buf,8192,0) == -1)
{
perror("Error in receiving response from server \n");
exit(1);
}

printf("\n Response from server:\n\n%s\n",buf);

close(socket_descriptor);

return (EXIT_SUCCESS);
}



分享到:
评论

相关推荐

    SOCKET编程之TCP服务端

    本篇将深入探讨"SOCKET编程之TCP服务端"的相关知识点,包括SOCKET的基础概念、TCP协议的特点以及如何构建一个基本的TCP服务器。 首先,让我们了解什么是SOCKET。SOCKET是操作系统提供的一个接口,它允许应用程序...

    linux下tcp简单的socket编程

    在Linux下,使用C语言进行TCP Socket编程主要包括以下步骤: 1. **创建Socket**:调用`socket()`函数创建一个Socket描述符,指定协议类型为TCP(即`SOCK_STREAM`)和协议族(通常为`AF_INET`代表IPv4)。 ```c int...

    Linux Socket编程基于TCP的客户服务器程序和配置脚本

    资源包含客户端程序tcpclient.c,服务器端程序tcpserver.c,Makefile文件以及一个自动化配置安装脚本 setup.sh,具体使用方法如下: 1 即make为运行make命令编译 client 和server, 2. 即包括1中内容和运行服务器端,...

    linux下C语言SOCKET编程客户端、服务器端代码

    本篇文章将深入探讨Linux下的C语言SOCKET编程,包括客户端和服务器端的实现。 首先,我们要理解SOCKET的基本概念。在计算机网络中,SOCKET是一种进程间通信(IPC)机制,它允许通过网络连接的两台机器上的进程相互...

    Linux下Socket编程

    在IT领域,Linux下的Socket编程是一项基础且重要的技能,它涉及到网络通信的核心技术。这篇博客“Linux下Socket编程”很可能会深入探讨如何在Linux操作系统环境下使用Socket接口进行网络编程,这是构建服务器端和...

    实战Linux Socket编程

    在IT领域,Linux Socket编程是网络通信的核心技术之一,它为开发者提供了在Linux操作系统上实现进程间通信(IPC)和网络通信的接口。本实战指南将深入探讨这一主题,帮助你掌握如何在Linux环境中构建高效的网络应用...

    Linux环境下基于TCP的Socket编程浅析

    ### Linux环境下基于TCP的Socket编程浅析 #### 摘要 本文主要探讨了Linux环境下基于TCP协议的Socket编程技术。Socket作为一种通用的进程间通信(IPC)方式,不仅适用于同一台计算机上的进程通信,也广泛应用于网络...

    C语言Socket简单编程指南

    文档提到了Linux公社网站,这表明了作者可能提供了一个与Linux操作系统相关的信息网站的链接,其中可能包含更多关于Linux平台下C语言Socket编程的资源和教程。 ### 总结 整个文档是一份对于初学者友好、深入浅出的...

    linux C语言 socket通信聊天小程序

    Socket编程是C语言在实现网络通信中的核心部分,它允许不同计算机之间的进程进行数据交换。本项目涉及的"Linux C语言 socket通信聊天小程序"是一个基础的网络聊天应用,支持群聊和私聊功能。 首先,我们需要理解...

    Linux的SOCKET编程详解 pdf格式

    在Linux下,Socket编程可以使用不同的编程语言实现,如C、C++等,其中C语言是最常用的一种,因为它提供了与操作系统底层交互的丰富接口。 Socket编程根据传输协议的不同,可以分为基于TCP的Socket编程和基于UDP的...

    linux下socket编程之以select方式实现并发服务器

    在Linux系统中,Socket编程是网络通信的核心技术之一。这里我们关注的是如何使用`select`函数来实现一个并发服务器,这个服务器模型被称为多路复用I/O(Multiplexed Input/Output)。`select`函数是Linux提供的一种I...

    Linux下Socket编程 聊天软件

    在Linux操作系统中,Socket编程是一种实现网络通信的基本方式,它为进程间通信(IPC)提供了接口,同时也广泛应用于客户端和服务器之间的数据交换。本聊天软件是基于Linux Socket编程实现的,尽管目前还不支持用户...

    linux-c++ socket编程

    在IT领域,Linux环境下的C++ Socket编程是网络通信的核心技术之一。Socket接口提供了一种在不同进程间通过网络进行通信的方法,无论这些进程是否在同一台机器上。本压缩包包含了一个简单的TCP服务器(TCPServer.zip...

    Linux网络编程示例,TCP和UDP

    9. **C语言编程**:本示例使用C语言编写,因为C语言是系统编程的基础,它提供了对底层操作系统的直接访问,包括Socket API。C语言代码通常更高效,但也需要程序员手动管理内存和错误处理。 10. **实践应用**:这些...

    实战linux+socket编程

    在IT领域,Linux和Socket编程是构建网络应用程序的基础。Linux作为一个开源操作系统,为开发者提供了丰富的API和工具,而Socket则是网络通信的核心接口。本实战指南将深入探讨如何在Linux环境中运用Socket进行网络...

    Linux下的Socket编程实例(阻塞和非阻塞)

    Linux下的Socket编程实例是使用 C/C++ 语言实现的,通过使用 socket 函数创建一个 Socket,然后调用 bind 函数将其与本机地址以及一个本地端口号绑定,最后调用 listen 函数在相应的 socket 上监听。使用 fork 函数...

    实战Linux Socket编程源码

    Linux Socket编程是网络编程的重要组成部分,它允许程序通过网络发送和接收数据。在这个"实战Linux Socket编程源码"中,我们可以深入理解并实践Socket的工作原理和应用。源代码的第11章着重于处理多个客户端的连接,...

    linux-socket-c.rar_linux socket tcp_linux 网络编程_linux网络编程_socket

    总的来说,Linux Socket编程涵盖了TCP和UDP协议的应用,以及如何使用标准的Berkeley Sockets API在Linux系统中实现网络通信。通过实践和学习提供的示例,开发者可以掌握创建网络服务、处理客户端请求、实现数据传输...

    Linuxsocket编程入门[参照].pdf

    本教程将从基础开始,详细介绍 Linux Socket 编程的入门知识,包括 TCP server 端的实现。 一、Socket 编程的概念 Socket 编程是一个庞大的体系,包括TCP/IP、网络层、运输层、应用层等多个层次。Socket 编程的...

Global site tag (gtag.js) - Google Analytics