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宝贵的时间片,但是如果需要对多个描述符操作时,阻塞会使同一时刻只能 ...
随机推荐
- Android 优秀的开源框架整理
第一部分:系统架构 thinkAndroid https://github.com/white-cat/ThinkAndroid ThinkAndroid是一个免费的开源的.简易的.遵循Apache2 ...
- Android项目结构分析
andriod项目目录结构如下图: 1. src目录 该目录一个普通的保存java源文件的目录,其和普通java工程中的src目录是一样的. 2. gen目录 此目录用于存放所有由ADT插件自动生成的 ...
- 苹果手机不进post方法
今天遇到一个问题,开发的公众号中的一个界面在安卓和微信开发者工具中可以正常显示,在苹果手机中加载不出数据. 以下是部分代码: var start = 0; var limit = 15; var ca ...
- XtraScheduler 日程控件显示自定义标题
下面代码实现一个自定义日程标题 public class CustomHeaderCaptionService : HeaderCaptionServiceWrapper { public Custo ...
- Java 读取txt文件,读取结果保存到数据库
需求:有一个很大的txt文件(1,000,000条数据),从txt中读取有用数据库后保存到Oracle数据库中 利用Java实现: 1.加载文件后一行一行读取 2.数据库连接后按行插入到数据库 pac ...
- oracle缓存池使用解析
oracle有三种类型的缓存池,分别是default,keep和recycle.默认情况下只会使用default缓存池,另外两种需要额外配置. keep缓存池相当于是一直很热的default缓存池,缓 ...
- cocos2d-x之物理引擎初试
发现问题:监听代码部分不能在onEnter()段书写 bool HelloWorld::init() { if ( !Layer::init() ) { return false; } visible ...
- 图片代替radio
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- Class to connect postgres with python in psycopg2
For we need to connect the postgres db in project very frequently, so write the follows class: impor ...
- 【MVC 4】2.使用 Razor
作者:[美]Adam Freeman 来源:<精通ASP.NET MVC 4> Razor 是微软 MVC3 引入的视图引擎的名称,并在MVC 4 中进行了修订.视图引擎处理 A ...