Linux 简单socket实现TCP通信
服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h> int main( int argc, char *argv[] )
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size, portnumber;
const char hello[] = "Hello!\n";
if ( argc != )
{
printf("Usage: %s portnumber\a\n", argv[]);
exit();
} if ( (portnumber = atoi(argv[])) < )
{
printf("Usage: %s portnumber\a\n", argv[]);
exit();
} /* 服务器端创建socket */
if ( ( sockfd = socket(AF_INET, SOCK_STREAM, ) ) == )
{
printf("Socket Error !\n");
exit();
} /* 服务器端填充sockaddr结构 */
bzero( &server_addr, sizeof(struct sockaddr_in) );
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(portnumber); /* 将本地地址与socket绑定 */
if ( bind( sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr) ) == - )
{
printf("Bind Error!\n");
exit();
} /* 进入监听模式 */
if ( listen( sockfd, ) == )
{
puts("Listen Error!");
exit();
} while ()
{
/* 服务器阻塞,直到与客户端建立连接 */
sin_size = sizeof(struct sockaddr_in);
if ( (new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), (socklen_t *)&sin_size ) ) == - )
{
puts("Accept Error!");
exit();
}
/* 连接成功 */
printf("Server get connection from %s\n", inet_ntoa(client_addr.sin_addr) );
inet_ntoa(client_addr.sin_addr);
if ( write( new_fd, hello, strlen(hello) ) == - )
{
puts("Write Error!");
exit();
} /* 本次通信结束,循环下一个 */
close(new_fd);
} /* 关闭当前连接 */
close(sockfd);
return ;
}
客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h> int main( int argc, char *argv[] )
{
int sockfd;
char buffer[];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber, nbytes;
if ( argc != )
{
printf("Usage: %s hostname portnumber\n", argv[] );
exit();
} if ( (host = gethostbyname(argv[])) == NULL )
{
puts("Host Error!");
exit();
} if ( (portnumber = atoi(argv[])) < )
{
printf("Usage: %s portnumber\a\n", argv[]);
exit();
} if ( ( sockfd = socket(AF_INET, SOCK_STREAM, ) ) == )
{
printf("Socket Error !\n");
exit();
} bzero( &server_addr, sizeof(struct sockaddr_in) );
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons( portnumber );
server_addr.sin_addr = *((struct in_addr *)host->h_addr); /* 与服务器建立连接 */
if ( connect( sockfd, (struct sockaddr *)(&server_addr), sizeof(server_addr) ) == - )
{
puts("Connect Error!");
exit();
} if ( (nbytes = read(sockfd, buffer, )) == - )
{
puts("Read Error!");
exit();
} buffer[nbytes] = '\0';
printf("I have received: %s\n", buffer );
close(sockfd);
return ;
}
运行结果
Linux 简单socket实现TCP通信的更多相关文章
- Linux 简单socket实现UDP通信
服务器端 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sy ...
- 码海拾遗:简单Socket(TCP)类实现
最近刚开始啃Unix网络编程(卷1:套接字联网API),为加深TCP连接的建立和终止的理解与记忆,记下本文,方便以后翻看. 同时留下的还有简单的Socket(TCP)类: mySocket.h #pr ...
- linux下socket编程-TCP
网络字节序 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出 ...
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
- Linux ---> 简单socket
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> ...
- TCP通信 -C/S中的Socket与ServerSocket
客户端类:Socket类 TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流 java.lang.Object 继承者 java.net.Socket 构造方法: ...
- UE4 Sockets多线程TCP通信
转自:https://blog.csdn.net/zilisen/article/details/75007447 一.简介 UE4引擎是提供了Sockets模块和Networking模块的,博主在研 ...
- IPv6下网络编程socket, TCP和UDP例子,以及兼容IPV4和IPV6的类
一.TCP socket ipv6与ipv4的区别 服务器端源代码如下: #include <stdio.h> #include <stdlib.h> #include < ...
- TCP通信的客户端代码实现和TCP通信的服务器代码实现
TCP通信的客户端代码实现 package com.yang.Test.ServerStudy; import java.io.*; import java.net.Socket; /** * TCP ...
随机推荐
- iOS9全新的联系人相关框架——Contacts Framework
iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用 ...
- 原生js的常见封装
)); } ;;;;]){ ]; ] = ;;;,) ,) ,) ,) ,) , ...
- Linux 学习第二天
一.常用命令的使用 1.echo echo https://www.cnblogs.com/rise-home/ 输出字符串 2.ps -aux(显示进程信息) ps 进程状态共有5种 A.STAT ...
- 启用image-filter扩展模块
进入lnmp目录打开lnmp.conf配置文件 修改Nginx_Modules_Options=' --prefix=/usr/local/nginx --with-http_image_filter ...
- 【基于不同设备厂商在处理vlan之间通信配置例子】
H3C: Dot1q子接口实现vlan之间的通信 一:根据项目需求搭建好拓扑图如下: 二:配置 HUAWEI: CISCO
- 【poe设备加电配置】
开启接口的poe功能: [interface_name]: 配置poe端口的最大功率: [interface_name[: 配置poe的端口工作模式: [interface_name[: 配置poe端 ...
- PHP-入门指引1
PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web ...
- 使用Jcrop-canvas画布-制作前端图像裁剪
写在前面 –公司有这个需求,安排调查 –目前各大网站都是采用的-前端做裁剪返回坐标-由后端来做到裁剪 –而使用html-canvas画布可以直接前端裁剪并返回base64流-ajax可以直接下载保存 ...
- Python学习 :六个标准数据类型
一.Numbers(数字类型) 数字类型主要分为两种—— 整数(Integer)与 浮点数(Float) 整数分为整型和长整型(在Python3中已经不再区分为整型与长整型,统一称为整型) 注意:数字 ...
- 002---Python基本数据类型--字符串
字符串 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1p ...