服务器端代码

#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. 数据库——MySQL——单表查询

    单表查询语法: SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 关键字的执行 ...

  2. Struts2 第四讲 -- Struts2的基本配置

    5.struts2的基本配置 5.1 struts2的访问连接url 在struts1中,通过<action path=“/primer/helloWorldAction.action”> ...

  3. mysql 复制A表 到B表;insert into select * from table

    情况一: INSERT INTO tb1 (a,b,c) select a1,b1,c1, from tb2 where .... --  案例 百度云 INSERT INTO l_biz_car_o ...

  4. SAP常见问题与解决办法(转)

    1.A:在公司代码分配折旧表时报错? 在公司代码分配折旧表时报错,提示是“3000 的公司代码分录不完全-参见长文本” 希望各位大侠帮我看看.3000 的公司代码分录不完全-参见长文本 R: a.你把 ...

  5. JS数组push一个对象

    这个是正确的数据添加对象 var dypieArr = []; var dyArr = []; var arrStr = ''; for(var i = 0; i < dataStreet.le ...

  6. 使用百度定位Api获取当前用户登录地址

    最近在做一个商城项目,客户想把网站做成类似于美团的效果,切换地区时,内容也跟随变化.这就要首先解决根据用户id获得地址的问题,最终决定使用百度定位(不适用于搭建反向代理的项目) String url ...

  7. Git----使用WebHook实现代码自动部署

    起因: 经常本地push到gitee等线上代码仓库,然后登陆服务器在进行pull,很麻烦,想偷懒怎么办?使用git的webhook实现! 1.实现原理 1.1本地提交推送 1.2线上仓库监听push动 ...

  8. IT类职位常用缩写 SA SD RD PG PM DBA MIS QA Sales

    身为IT民工的基本常识,IT类职位常用缩写 SA (System Analyst) 系统分析师 在软体开发团队中,属于中高阶的基层管理者与领导者.除了须具备优秀的文字.语言沟通能力之外,还要有良好的分 ...

  9. Go生成UUID

    Go生成UUID 在实际项目中,是经常会使用到一个唯一标识的,比如唯一标识一条记录等,使用C#得到唯一标识是很容易的.例 string guid = Guid.NewGuid().ToString() ...

  10. HyperLedger Fabric 1.4 架构(6.2)

    6.2.1 架构演进       Fabric架构经历了0.6版本到1.0版本的演进,架构上进行了重大改进,从0.6版本的结构简单演进到可扩展.多通道的设计,在架构上有了质的飞跃:从1.0版本以后,架 ...