//网络编程客户端
#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代码详解)的更多相关文章

  1. Linux网络编程(三)

    Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...

  2. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  3. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  4. linux高性能服务器编程 (三) --TCP协议详解

    第三章 IP协议详解 TCP协议是TCP/IP协议族中的另外一个重要的协议,与IP协议相比,TCP协议更高进应用层.一些重要的socket选项都和TCP协议相关.这一章主要从如下方面学习: 1)TCP ...

  5. iOS开发——网络编程Swift篇&Alamofire详解

    Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...

  6. 网络编程UDP、TCP详解

    网络编程   网络编程主要用于解决计算机与计算机(手机.平板-)之间的数据传输问题. 1.InetAddress(IP类)   方法: 方法 描述 getLocalHost() 获取本机的IP地址对象 ...

  7. 网络协议之:socket协议详解之Socket和Stream Socket

    目录 简介 Socket是什么 Stream Socket 使用socat创建一个TCP服务器 使用ss检查TCP连接 使用nc连接socket 总结 简介 不管是在普通的网络编程中还是在netty中 ...

  8. Linux网络编程3——socket

    宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* & ...

  9. Linux网络编程三、 IO操作

    当从一个文件描述符进行读写操作时,accept.read.write这些函数会阻塞I/O.在这种会阻塞I/O的操作好处是不会占用cpu宝贵的时间片,但是如果需要对多个描述符操作时,阻塞会使同一时刻只能 ...

随机推荐

  1. RecyclerView添加头部和底部视图的实现

    ListView是有addHeaderView和 addFooterView两个方法的. 但是作为官方推荐的ListView的升级版RecyclerView缺无法实现这两个方法. 那么如果使用Recy ...

  2. 干货-iOS、mac开源项目及库,以后我也会持续更新。

    昨晚在网上看的干货,直接分享给大家了,觉得有用的,直接fork吧. https://github.com/Brances/TimLiu-iOS

  3. Swift语言

    本文为熟悉使用Objective-C开发iOS快速转入swift开发提供一些便利的途径,没有过多华丽的说明底层原理,也没有过多的概念说明,只提供swift的基本使用以及一些使用示例.高手请让路哈. S ...

  4. iOS多线程-05-多图下载

    效果图 常见问题及解决方法 图片重复下载 将内存保存在内存或沙盒中. 若下载的图片量较大,则会出现UI界面不流畅的现象 在子线程中执行下载操作,然后回到主线程成中进行UI界面的刷新. 由于cell的循 ...

  5. IOS的UI基础02

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  6. UVa 108 - Maximum Sum(最大连续子序列)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  7. 敏捷开发中高质量 Java 代码开发实践

    Java 项目开发过程中,由于开发人员的经验.代码风格各不相同,以及缺乏统一的标准和管理流程,往往导致整个项目的代码质量较差,难于维护,需要较大的测试投入 和周期等问题. 这些问题在一个项目组初建.需 ...

  8. jQuery DataTables 行获取

    datatables的官方例子中似乎没有提到表格双击和获取相应行号的功能; 经过探索可以按照以下方式实现:  $("#example tbody tr").dblclick(fun ...

  9. C语言杂谈(一)scanf()、scanf_s()与错误 C4996

    错误 C4996 初学C语言时,第一个接触到的I/O函数便是scanf()了.但在高版本的 Visual Studio (包括但不限于2015.2013.2012)编译代码时,却会出现意想不到的错误. ...

  10. SQL中case语句的两种方式