Linux 网络编程三(socket代码详解)
//网络编程客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>//htons()函数头文件
#include <netinet/in.h>//inet_addr()头文件 int main(int arg,char *args[])
{
int st=socket(AF_INET,SOCK_STREAM,);//初始化socket
if(st==-)
{
printf("init socket failed ! error message :%s\n",strerror(errno));
return -;
}
struct sockaddr_in addr;//定义IP地址结构
memset(&addr,,sizeof(addr));
addr.sin_family=AF_INET;//设置结构地址类型为TCP/IP地址
/*
字节转化
网络当中传输数据是以字节为单位,short类型无法在网络中传输,必须转化成网络类型,
例如short类型有2个字节,在网络传输中无法知道哪个是高位字节,那个是低位字节,所以系统提供htons()函数来处理。
所以,在网络中传输非char型数据,必须调用相应的系统函数,将这个类型转化成网络中的char类型。
*/
addr.sin_port=htons();//指定端口号 htons:将short类型从host字节类型到net字节类型转化
/*
IP地址在内存中是一个整数,但是我们习惯于写一个字符串
inet_addr()函数能将一个字符串的IP地址转化成一个int类型数字
*/
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//调用connect()函数连接结构addr指定的IP地址和端口号
/*
connect()函数第二个参数详解:
struct sockaddr类型是一个比较旧的类型,现在一般都使用struct sockaddr_in类型
但是struct sockaddr和struct sockaddr_in类型是相互兼容的
*/
if(connect(st,(struct sockaddr *)&addr,sizeof(addr))==-)
{
printf("connect failed ! error message :%s\n",strerror(errno));
goto END;
}
char buf[]={};
strcpy(buf,"fly on air !\n");
if(send(st,buf,strlen(buf),)==-)//发送buf中的数据
{
printf("send failed ! error message:%s\n",strerror(errno));
goto END;
}
END:
close(st);
return ;
}
//网络编程服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>//htons()函数头文件
#include <netinet/in.h>//inet_addr()头文件 int main(int arg,char *args[])
{
int st=socket(AF_INET,SOCK_STREAM,);//初始化socket
if(st==-)
{
printf("init socket failed ! error message :%s\n",strerror(errno));
return -;
} int on=;
if(setsockopt(st,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))==-)
{
printf("setsockopt failed ! error message :%s\n",strerror(errno));
goto END;
} struct sockaddr_in addr;
memset(&addr,,sizeof(addr));
addr.sin_family=AF_INET;
//服务端绑定端口号时,需要去系统设置里将该端口号打开
addr.sin_port=htons();
/*
htonl()函数将一个4字节的long类型数据转化成网络类型
*/
addr.sin_addr.s_addr=htonl(INADDR_ANY);//INADDR_ANY代表这个server上所有的地址
//将IP地址与server进行绑定
if(bind(st,(struct sockaddr *)&addr,sizeof(addr))==-)
{
printf("bind IP addr failed ! error message:%s\n",strerror(errno));
goto END;
}
//server开始listen
if(listen(st,)==-)
{
printf("listen failed ! error message :%s\n",strerror(errno));
goto END;
}
int client_st=;//client端socket
struct sockaddr_in clientaddr;//client端的IP地址
char buf[]={};
int i=;
while(i<)
{
memset(&clientaddr,,sizeof(clientaddr));
socklen_t len= sizeof(clientaddr);//表示client地址的最大字节数
/*
accept会阻塞当前线程,直到有客户端连接过来,accept()函数返回client端的socket描述符
*/
client_st=accept(st,(struct sockaddr *)&clientaddr,&len);
if(client_st==-)
{
printf("accept failed ! error message :%s\n",strerror(errno));
goto END;
}
if(recv(client_st,buf,sizeof(buf),)==-)//接收来自client端的消息
{
printf("recv failed , send from IP error message:%s\n",strerror(errno));
close(client_st);//关闭client端socket
goto END;
}
printf("%s",buf);
close(client_st);//关闭client端socket
memset(buf,,sizeof(buf));
i++;
}
END:
close(st);//关闭服务器socket
return ;
}
.SUFFIXES:.c .o
CC=gcc
SRCS1=myclient.c
SRCS2=server.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
EXEC1=mclient
EXEC2=mserver start:$(OBJS1) $(OBJS2)
$(CC) -o $(EXEC1) $(OBJS1)
$(CC) -o $(EXEC2) $(OBJS2)
@echo "-------ok-----------"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS1)
rm -f $(EXEC1)
rm -f $(OBJS2)
rm -f $(EXEC2)
Linux打开端口号





Linux 网络编程三(socket代码详解)的更多相关文章
- Linux网络编程(三)
Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...
- Linux Shell编程与编辑器使用详解
<Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux高性能服务器编程 (三) --TCP协议详解
第三章 IP协议详解 TCP协议是TCP/IP协议族中的另外一个重要的协议,与IP协议相比,TCP协议更高进应用层.一些重要的socket选项都和TCP协议相关.这一章主要从如下方面学习: 1)TCP ...
- iOS开发——网络编程Swift篇&Alamofire详解
Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...
- 网络编程UDP、TCP详解
网络编程 网络编程主要用于解决计算机与计算机(手机.平板-)之间的数据传输问题. 1.InetAddress(IP类) 方法: 方法 描述 getLocalHost() 获取本机的IP地址对象 ...
- 网络协议之:socket协议详解之Socket和Stream Socket
目录 简介 Socket是什么 Stream Socket 使用socat创建一个TCP服务器 使用ss检查TCP连接 使用nc连接socket 总结 简介 不管是在普通的网络编程中还是在netty中 ...
- Linux网络编程3——socket
宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* & ...
- Linux网络编程三、 IO操作
当从一个文件描述符进行读写操作时,accept.read.write这些函数会阻塞I/O.在这种会阻塞I/O的操作好处是不会占用cpu宝贵的时间片,但是如果需要对多个描述符操作时,阻塞会使同一时刻只能 ...
随机推荐
- 分形几何算法和实现(C语言)
初识分形 1.分形的含义: 英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的.其含义是不规则的.破碎的.分数的.曼德勃罗是想用此词来描述自然界中传统 ...
- 发布的时候Archive灰色
主要是因为发布的时候要选为将模拟器选择一下,选为Generic iOS Device. 来自为知笔记(Wiz)
- swift网络编程入门应用:天气预报
学习来自<小波说雨燕 第二季 网络编程(入门篇)> 工具:xcode6.4 首先在Main.storyborad中添加并设置好三个label做简单的界面显示: import UIKit / ...
- 人机交互—对win10自带输入法的评价
在我的电脑换成win10系统后我就用他自带的输入法,它可以中英文切换,用起来很方便,就用了它,就没有下载别的输入法. 用户界面:这个输入法的界面非常简单,没有像搜狗,百度之类的皮肤一说,看起来很简单, ...
- C语言初学者代码中的常见错误与瑕疵(5)
问题: 素数 在世博园某信息通信馆中,游客可利用手机等终端参与互动小游戏,与虚拟人物Kr. Kong 进行猜数比赛. 当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将 ...
- Tesseract-OCR 字符识别---样本训练 [转]
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文). ...
- C# 文件操作(上传,下载,读取,写入)
1. 通过byte[]数据下载文件(这种方法可用于以开放Api的形式传递文件内容) public void FileDownLoadByByte(byte[] fileData, string fil ...
- mysql基础操作学习笔记(2)----索引
为什么要创建索引? 在此本人也带着相同的疑问,能够解释的仅仅是:为了减少数据库查询时所需要的速度.如果正常查询和索引查询所需时间相差很多倍时我们自然是需要索引的了. 想要知道结果,只能等我学得 ...
- 【nginx】配置文件的优化
1.编译安装过程优化 在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆字节.在编译前取消Nginx的deb ...
- c# 反射简单使用
类库dll,将生成ExampleLib.dll文件 namespace ExampleLib { public class Example { public static string FuncA() ...