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宝贵的时间片,但是如果需要对多个描述符操作时,阻塞会使同一时刻只能 ...
随机推荐
- CollectionView 简用
创建一个CollectionView 分为几个步骤 1.先创建布局FlowLayout 设置布局格式 2.创建CollectionView 并使用布局Flowlayout -initWithFram ...
- iOS开发 使用RMStore简化内购代码 + 内购买订单验证
现在很多的app里面都添加了应用内购买,网上关于苹果证书的生成和设置的教程比较多,这里就不多赘述了,推荐几个个人觉得说的比较详细的网址: http://www.jianshu.com/p/86ac7d ...
- iOS之 PJSIP静态库编译(三)
dada哪个所有静态库编译完成后还是不能运行那个demo,提示你找不到arm**.a 你lipo后要记得吧合并成.a 名字更改成你最后编译版本生成的.a名字....... 或者吧所有库add到你的工 ...
- android 进程间通信---Service Manager(2)
关于servicemanager的设计: 还是这张结构图,由于ProcessState & IPCThreadState是与binder deriver交互的, 所以对于client端来说Bp ...
- JIRA系统部署推进上线流程
JIRA介绍: JIRA是集项目计划.任务分配.需求管理.问题跟踪于一体的商业软件.JIRA创建的问题类型包括New Feature.Bug.Task和Improvement四种(可以自己定义),所以 ...
- Memcache修改端口
修改端口 网上很多的说法都无法起作用(像下面这样) D:\.......memcached -p 10000 -d start 现在有两种解决方法 ①直接修改注册表 HKEY_LOCAL_MACHIN ...
- MySQL之ALTER
1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL COMMENT '注释说明' 3:修 ...
- 被废弃的 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit
最近学习多线程的知识,看到API里说这些方法被废弃了,就查了一下原因 Thread.stop 这个方法会解除被加锁的对象的锁,因而可能造成这些对象处于不一致的状态,而且这个方法造成的ThreadDea ...
- uva 12655 Trucks [LCA](树链剖分+MST)
The Subtle Balloons Company (SBC) is the main balloon provider for programming contests; it hashuge ...
- 纯CSS3制作学生入学档案表单样式代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...