Socket编程:之TCP案例
转载请加上博文引用:http://i.cnblogs.com/EditPosts.aspx?postid=5733248&update=1
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> int sockfd; void do_service(int fd)
{
long t = time();
char *s = ctime(&t);
write(fd,s,strlen(s));
}
void out_client(struct sockaddr_in clientaddr)
{
char buffer[];
inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,buffer,sizeof(clientaddr));
unsigned short port = ntohs(clientaddr.sin_port);
printf("client ip:%s (%d)\n",buffer,port);
} int main(int argc,char *argv[])
{
if(argc < )
{
fprintf(stderr,"usage: %s port\n",argv[]);
exit();
} //创建套接字
sockfd = socket(AF_INET,SOCK_STREAM,);
if(sockfd < )
{
fprintf(stderr,"socket: %s\n",strerror(errno));
exit();
} //设置IP和端口
struct sockaddr_in addr;
memset(&addr,,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[]));
addr.sin_addr.s_addr = INADDR_ANY; //绑定IP和端口
int len = sizeof(addr);
if(bind(sockfd,(struct sockaddr*)&addr,len) < )
{
fprintf(stderr,"bind: %s\n",strerror(errno));
exit();
} //开始听
if(listen(sockfd,) < )
{
fprintf(stderr,"listen: %s\n",strerror(errno));
exit();
} while()
{
struct sockaddr_in clientaddr;
int c_len = sizeof(clientaddr);
int fd = accept(sockfd,(struct sockaddr*)&clientaddr,&c_len);
if(fd < )
{
fprintf(stderr,"accept: %s\n",strerror(errno));
continue;
}
out_client(clientaddr);
do_service(fd);
close(fd);
}
return ;
}
编译:
gcc -o server server.c
运行:
./server 6666
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> int sockfd; int main(int argc,char *argv[])
{
if(argc < )
{
fprintf(stderr,"usage: %s port\n",argv[]);
exit();
} sockfd = socket(AF_INET,SOCK_STREAM,);
if(sockfd < )
{
fprintf(stderr,"socket:%s\n",strerror(errno));
exit();
} struct sockaddr_in sockaddr;
memset(&sockaddr,,sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(atoi(argv[]));
inet_pton(AF_INET,argv[],&sockaddr.sin_addr.s_addr);
socklen_t len = sizeof(sockaddr); if(connect(sockfd,(struct sockaddr*)&sockaddr,len) < )
{
fprintf(stderr,"connect: %s\n",strerror(errno));
exit();
}
char buffer[];
memset(buffer,,sizeof(buffer));
ssize_t n;
if((n = read(sockfd,buffer,)) < )
{
fprintf(stderr,"read: %s\n",strerror(errno));
exit();
}
else
{
printf("%s\n",buffer);
} return ;
}
编译:
gcc -o client client.c
运行:
./client 192.168.0.30 6666
Socket编程:之TCP案例的更多相关文章
- 计算机网络(十三),Socket编程实现TCP和UDP
十三.Socket编程实现TCP和UDP 1.TCP (1)TCPServer.java类 package com.interview.javabasic.socket; import com.int ...
- day8---多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
- python socket 编程(TCP与UDP)
实验环境:python2 一.TCP编程 1.建立TCP服务器 ①创建TCPServer.py文件 ②编写服务器代码 1)创建socket对象,调用socket构造函数 2)绑定ip端口(IP号和端口 ...
- day08 多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
- 基于C#的socket编程的TCP同步实现
该博客源著地址https://www.cnblogs.com/sunev/archive/2012/08/05/2604189.html 一.摘要 总结一下基于C#的TCP传输协议的涉及到的常用方法及 ...
- socket编程实现tcp服务器_C/C++
1. 需求分析 实现一个回声服务器的C/S(客户端client/服务器server)程序,功能为客户端连接到服务器后,发送一串字符串,服务器接受信息后,返回对应字符串的大写形式给客户端显示. 例如: ...
- python网络编程socket编程(TCP、UDP客户端服务器)
摘录 python核心编程 使用socket()模块函数创建套接字——通信端点 >>> from socket import * >>> tcpSock = soc ...
- 基于C#的socket编程的TCP异步实现
一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法 ...
- (转)基于C#的socket编程的TCP异步实现
一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法 ...
- 如何在socket编程的Tcp连接中实现心跳协议
from http://blog.csdn.net/nyist327/article/details/39586203 心跳包的发送,通常有两种技术方法1:应用层自己实现的心跳包 由应用程序自己发送心 ...
随机推荐
- 1 R语言介绍
注释:# 赋值:<- 查看.设定当前工作目录:getwd() setwd() wd:workspace directory[setwd("c:/myproject/project ...
- Spring Boot集成持久化Quartz定时任务管理和界面展示
本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ...
- linux运维需要掌握的基础知识
踏入linux运维工程师这一职业,其实有很多工具技能需要掌握,下面我来给大家一一介绍. 1.shell脚本和另一个脚本语言,shell是运维人员必须具备的,不懂这个连入职都不行,至少也要写出一些系统管 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(三)安装spark2.2.1
如何搭建配置centos虚拟机请参考<Kafka:ZK+Kafka+Spark Streaming集群环境搭建(一)VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网.& ...
- (转)思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...
转自:http://www.cnblogs.com/soroman/archive/2008/03/21/1115571.html 思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用1. ...
- codeforces 551 C GukiZ hates Boxes
--睡太晚了. ..脑子就傻了-- 这个题想的时候并没有想到该这样-- 题意大概是有n堆箱子从左往右依次排列,每堆ai个箱子,有m个人,最開始都站在第一个箱子的左边, 每个人在每一秒钟都必须做出两种选 ...
- (算法)Game
题目: Jeff loves playing games, Gluttonous snake( an old game in NOKIA era ) is one of his favourites. ...
- Javascript 闭包(Closures)
本文内容 闭包 闭包和引用 参考资料 闭包是 JavaScript 的重要特性,非常强大,可用于执行复杂的计算,可并不容易理解,尤其是对之前从事面向对象编程的人来说,对 JavaScript 认识和编 ...
- Spring中默认bean名称的生成策略/方式修改
最近公司项目打算模块化,其实一个原因也是为了能够整合公司多个业务的代码,比如一个资源xxx,两个业务中都有对这个资源的管理,虽然是一个资源,但是是完全不同的定义.完全不同的表.不同的处理逻辑.所以打算 ...
- 去除Win10快捷图标小箭头
有点强迫症,一看到操作系统上的快捷图标小箭头就想把它去除掉. 去除小箭头 reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cur ...