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 ...
随机推荐
- Oracle PL/SQL中异常高级特性
在OraclePL/SQL语句块中exception的异常处理部分是非常重要的组成部分,它决定了在PL/SQL语句块内部可执行部分在发生异常错误时,程序是友好地提示:程序遇到某些错误而无法执行,还是抛 ...
- shiro框架 4种授权方式 说明
1. shiro的配置文件(applicationContext-shiro.xml)中使用filterChain过滤url的方式 详细配置看注释 <?xml version="1.0 ...
- udt通信java再次升级1.1版
以前完成了udt的java代码测试,功能基本完成,近几天有时间重新梳理了下源码: 对原通信的关闭统一了方法,close定位过时,由shutdown与shutdownNow代替. 将一些主要方法添加了注 ...
- 你不知道的javaScript笔记(4)
类型: JavaScript 有7种内置类型 空值 (null) 未定义(undefined) 布尔值(boolean) 数字(number) 字符串(string) 对象(object) 符号(sy ...
- CF1042A 【Benches】(优先队列)
这是一道良心的cf题 题意里让你求的是来了m个人后人数最多的长椅上最少和最多有多少人 如果要求最多,很好办,m个人都挤到原来人数最多的长椅上了(一眼看出) 但如果要求最少呢? 大家看图 长椅某个时间的 ...
- 2018 Wannafly summer camp Day2--Utawarerumono
Utawarerumono 描述 题目描述: 算术是为数不多的会让久远感到棘手的事情.通常她会找哈克帮忙,但是哈克已经被她派去买东西了.于是她向你寻求帮助. 给出一个关于变量x,y的不定方程ax+by ...
- 解决WordPress设置错误的url网站不能访问的问题
通过WordPress后台首选项更改了网站url地址之后,网站就会出现访问不了的情况,一般来说,网站后台也登陆不上去了,我从网上寻找到了四种方法,这四种方法前三种都是需要登陆到后台的,但实际上出错后, ...
- 设置Vim编辑器里Tab的长度,行号
使用Vim编辑器写脚本时,经常会遇到多重循环语句,习惯上会用tab键来补齐.这时设置tab键占用的长度,可以调节界面的松紧度,使其达到令人满意的效果. 在针对个别用户和所有用户来设置时,与编辑SSH相 ...
- 记js里codePointAt()方法返回的结果的含义。
经过<字符串的扩展>和<字符编码的那些事>这两篇文章的阅读,大概了解js里codePointAt方法返回结果的含义. var str='
- 【Js】Jquery遍历-each(function(e){})中的e和$(this)的区别
$("selector").each(function(e){ console.log($(e)); console.log($(this)); console.log(e); c ...