服务器端代码

#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通信的更多相关文章

  1. Linux 简单socket实现UDP通信

    服务器端 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sy ...

  2. 码海拾遗:简单Socket(TCP)类实现

    最近刚开始啃Unix网络编程(卷1:套接字联网API),为加深TCP连接的建立和终止的理解与记忆,记下本文,方便以后翻看. 同时留下的还有简单的Socket(TCP)类: mySocket.h #pr ...

  3. linux下socket编程-TCP

    网络字节序 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出 ...

  4. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

  5. Linux ---> 简单socket

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

  6. TCP通信 -C/S中的Socket与ServerSocket

    客户端类:Socket类 TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流 java.lang.Object 继承者 java.net.Socket 构造方法: ...

  7. UE4 Sockets多线程TCP通信

    转自:https://blog.csdn.net/zilisen/article/details/75007447 一.简介 UE4引擎是提供了Sockets模块和Networking模块的,博主在研 ...

  8. IPv6下网络编程socket, TCP和UDP例子,以及兼容IPV4和IPV6的类

    一.TCP socket ipv6与ipv4的区别 服务器端源代码如下: #include <stdio.h> #include <stdlib.h> #include < ...

  9. TCP通信的客户端代码实现和TCP通信的服务器代码实现

    TCP通信的客户端代码实现 package com.yang.Test.ServerStudy; import java.io.*; import java.net.Socket; /** * TCP ...

随机推荐

  1. 如何关闭Eclipse智障的变量命名自动补全功能

    找到了最最完美的解决方案,无需下载源码. 详见:https://zhidao.baidu.com/question/1451659429285222820.html

  2. 优雅的QSignleton (五) 优雅地进行GameObject命名

      这段时间空调吹感冒了,休息了好久 ​ 本篇介绍QSingleton最重要的功能,是它让QSingleton称得上优雅.相关内容之前介绍过. 代码如下: MonoSingletonPath.cs n ...

  3. Oracle 11g RAC小结

    1.查看数据库所有实例与状态 unixdev$[/home/grid]srvctl status database -d unixdev Instance unixdev11 is running o ...

  4. c# 分布式系统开发

    开篇吹牛,吹大牛了各位. 接连几篇博文,已经将了我们系统常用的东西,主要针对服务端,非桌面系统. 聊了这么久了,最后将这所有内容打包,完成一个系统.可能称为组件才合适,因为我没有提供启动程序. 每一个 ...

  5. spring boot 搭建基本套路《1》

    1. Spring复习 Spring主要是创建对象和管理对象的框架. Spring通过DI实现了IoC. Spring能很大程度的实现解耦. 需要掌握SET方式注入属性的值. 需要理解自动装配. 需要 ...

  6. (转)redis是什么

    1. 什么是Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Ser ...

  7. JavaScript--Dom操作元素的样式

    在前端开发中,有时候需要动态修改的网页元素的样式,这里将使用JS动态修改元素样式的方法做个小结: 网页结构: 按钮: 标签:input    类型:button     id:btn          ...

  8. vue 导出流文件excel

    第一种方法:需要设置响应类型,这里还需要安装 npm install js-file-download --save ,然后引用 var fileDownload = require('js-file ...

  9. php post提交xml文件

    <?php header("Content-type: text/xml;"); // xml code demo $xmlData = '<?xml version= ...

  10. Hadoop(13)-MapReduce框架原理--Job提交源码和切片源码解析

    1.MapReduce的数据流 1) Input -> Mapper阶段 这一阶段的主要分工就是将文件切片和把文件转成K,V对 输入源是一个文件,经过InputFormat之后,到了Mapper ...