在计算机网络编程中,Socket 是一种通信机制,用于在进程间进行数据传输。Linux 操作系统作为一款开源操作系统,在网络编程中广泛使用 Socket 这种通信机制。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、网站空间、营销软件、网站建设、霍山网站维护、网站推广。
Linux 通过 Socket 在应用程序和网络之间提供了一个通用的接口。Linux 的 Socket 实现提供了传输层和网络层协议的支持。Socket 提供了一种客户端和服务器端之间进行数据交互的方式,使用 Socket 客户端可以向服务器发送请求,服务器收到请求后进行处理并响应。
Linux Socket 的框架主要由以下几个部分组成:
1. Socket API:Socket API 是 Socket 编程的核心部分,提供了一组可供应用程序调用的函数接口,使应用程序可以通过 Socket 建立连接、发送和接收数据。
2. 协议栈:协议栈层次结构是实现网络传输的基础,它由多个协议层组成,每个协议层都有自己的特定任务。对于每个协议层,Linux 使用了不同的内核模块进行实现。
3. Socket 编排系统:通过 Socket 编排系统,可以理解为将不同的 Socket 绑定到不同的协议栈上,从而实现数据传输的目的。Socket 编排系统本质上就是一个 Socket 实现的核心。
4. Socket 驱动程序:Socket 驱动程序是有关硬件设备的代码,它提供了一组驱动函数,通过这些函数可以访问硬件设备。
Linux Socket 编程提供了 SO_REUSEADDR、SO_LINGER 等一系列选项,并以此实现了高效的 UDP 和 TCP 通信。Linux 提供了不同的内核模块,例如 af_unix、af_inet 等,以支持 Socket 编程中涉及到的不同协议。
Linux 的 Socket 框架的特点包括如下:
1. 灵活性:Linux 的 Socket 框架具有非常高的灵活性,因为可以根据不同的需要选择不同的协议。
2. 可扩展性:Linux 的 Socket 框架支持添加和删除新的协议层,这使得其具有极高的可扩展性。
3. 效率高:Linux 的 Socket 框架由 C 语言实现,C 语言具有高效的指针操作和优秀的内存管理,因此可以实现高效的数据传输。
4. 安全性高:Linux Socket 的实现基于内核态代码,具有很高的安全性。
Linux Socket 框架是一种高效、可靠、安全的通信机制,它为我们提供了一个强大的工具来进行网络编程。在开发 Linux 应用程序时,深入理解 Socket 框架,对于提高开发效率和编写出高质量的代码非常有帮助。
成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!
//服务端server.c
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 6000 /*服务器监册岁带听端口号 */
#define BACKLOG 10 /* 更大同时连接请求数 */
#define MAXDATASIZE 100
main()
{
char buf;
int sockfd,client_fd; /*sock_fd:监听雀饥socket;client_fd:数据传输socket */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror(“socket创建出错!”);
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror(“bind出错!”);
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror(“listen出错!”);
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror(“accept出州芦错”);
continue;
}
printf(“received a connection from %s\n”, inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子进程代码段 */
if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
{
perror(“recv出错!”);
close(client_fd);
exit(0);
}
buf = ‘\0’;
printf(“from client Received: %s”,buf);
if (send(client_fd, “thanks!\n”, 8, 0) == -1)
perror(“send出错!”);
close(client_fd);
exit(0);
}
close(client_fd);
}
}
//客户端client.c
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 6000
#define MAXDATASIZE 100
main(int argc, char *argv)
{
int sockfd, recvbytes;
char buf;
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror(“connect出错!”);
exit(1);
}
if (send(sockfd, “hello!\n”, 7, 0) == -1)
{
perror(“send出错!”);
exit(1);
}
if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror(“recv出错!”);
exit(1);
}
buf = ‘\0’;
printf(“Received: %s”,buf);
close(sockfd);
}
Socket通信创建步骤:
(1)通过socket()函数创建socket
(2)通过bind函数绑定socket于设备地址
(3)进行读写操作read/recv/recvfrom write/send/sendto
(4)close方法关闭套接字
例子如下:
test1.c
#include
#include
#include
#include
#include
int main(void)
{
//create socket
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd==-1)
{
perror(“socket\n”);
exit(-1);
}
printf(“socket fd=%d\n”,fd);
//build connection address
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
int r;
r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
if(r==-1)
{
perror(“bind”);
close(fd);
exit(-1);
}
printf(“bind address successful!\n”);
//accept or send message
char buf;
struct sockaddr_in from;
socklen_t len;
len = sizeof(from);
尘梁空 while(1)
{
r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len);
if(r>0)
{
buf=0;
printf(“The message from %s is:%s\n”,inet_ntoa(from.sin_addr),buf);
}
else
{
break;
}
}
//close socket
close(fd);
return 0;
}
test2.c
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
//create socket
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror(“socket”);
exit(-1);
}
printf(“create socket OK!\n”);
//create an send address
struct sockaddr_in addr={};
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
//send the message to the specify address
int r;
派瞎 char buf;
while(1)
{
r = read(0,buf,sizeof(buf)-1);
if(r
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 6000 /*服务器监册岁带听端口号 */
#define BACKLOG 10 /* 更大同时连接请求数 */
#define MAXDATASIZE 100
main()
{
char buf;
int sockfd,client_fd; /*sock_fd:监听雀饥socket;client_fd:数据传输socket */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror(“socket创建出错!”);
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror(“bind出错!”);
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror(“listen出错!”);
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror(“accept出州芦错”);
continue;
}
printf(“received a connection from %s\n”, inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子进程代码段 */
if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
{
perror(“recv出错!”);
close(client_fd);
exit(0);
}
buf = ‘\0’;
printf(“from client Received: %s”,buf);
if (send(client_fd, “thanks!\n”, 8, 0) == -1)
perror(“send出错!”);
close(client_fd);
exit(0);
}
close(client_fd);
}
}
//客户端client.c
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 6000
#define MAXDATASIZE 100
main(int argc, char *argv)
{
int sockfd, recvbytes;
char buf;
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror(“connect出错!”);
exit(1);
}
if (send(sockfd, “hello!\n”, 7, 0) == -1)
{
perror(“send出错!”);
exit(1);
}
if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror(“recv出错!”);
exit(1);
}
buf = ‘\0’;
printf(“Received: %s”,buf);
close(sockfd);
你这个东西问题配笑太多啦,老实说,我那过去编都编不过。我改好了,给你指出几个重大错误!
server:
#include
#include
#include
#include
#include
#include
#include
#define IPADDR “127.0.0.1”
#define PORT
const char *logpath = “./log”;
int main()
{
struct sockaddr_in servaddr,cliaddr;
int sockfd,clifd,logfd;
socklen_t clilen;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//段配bzero(&servaddr,sizeof(servaddr));
sockfd=socket(AF_INET,SOCK_STREAM,0);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
listen(sockfd,8);
printf(“aaaaaaaaaaaaaaaa\n”);
char buf = {0};
for(;;)
{
clilen = sizeof(cliaddr);
clifd=accept(sockfd,(struct sockaddr *)&cliaddr,&clilen);
printf(“%d\n”,clifd);
if(clifd
#include
#include
#include
#include
#include
#include
#include
#define PORT
#define SERVPORT
#define SERVADDR “127.0.0.1”
int main()
{
int servfd,clifd,connre;
struct sockaddr_in servaddr,cliaddr;
clifd=socket(AF_INET,SOCK_STREAM,0);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(21234);
servaddr.sin_addr.s_addr = inet_addr(“握卖指127.0.0.1”);
//bzero(&servaddr,sizeof(servaddr));
if((connre=connect(clifd,(struct sockaddr *)&servaddr,sizeof(servaddr)))
#include
#include
#include
#include
#include
#include
#define
IPADDR
“127.0.0.1”
#define
PORT
21234
const
char
*logpath
=
“./log”;
int
main()
{
struct
sockaddr_in
servaddr,cliaddr;
int
sockfd,clifd,logfd;
socklen_t
clilen;
servaddr.sin_family
=
AF_INET;
servaddr.sin_port
=
htons(PORT);
servaddr.sin_addr.s_addr
=
htonl(INADDR_ANY);
//配笑bzero(&servaddr,sizeof(servaddr));
sockfd=socket(AF_INET,SOCK_STREAM,0);
bind(sockfd,(struct
sockaddr
*)&servaddr,sizeof(servaddr));
listen(sockfd,8);
printf(“aaaaaaaaaaaaaaaa\n”);
char
buf
=
{0};
for(;;)
{
clilen
=
sizeof(cliaddr);
clifd=accept(sockfd,(struct
sockaddr
*)&cliaddr,&clilen);
printf(“%d\n”,clifd);
if(clifd
#include
#include
#include
#include
#include
#include
#include
#define
PORT
43212
#define
SERVPORT
21234
#define
SERVADDR
“127.0.0.1”
int
main()
{
int
servfd,clifd,connre;
struct
sockaddr_in
servaddr,cliaddr;
clifd=socket(AF_INET,SOCK_STREAM,0);
servaddr.sin_family
=
AF_INET;
servaddr.sin_port
=
htons(21234);
servaddr.sin_addr.s_addr
=
inet_addr(“127.0.0.1”);
//bzero(&servaddr,sizeof(servaddr));
if((connre=connect(clifd,(struct
sockaddr
*)&servaddr,sizeof(servaddr)))
{
printf(“sorry,connect
wrong\n”);
exit(1);
}
printf(“%d\n”,connre);
printf(“connect
ok,waiting
for
the
server’s
message
back\n”);
int
length;
char
buf;
while(1)
{
if((length
=
recv(clifd,buf,500,0))
{
continue;
}
else
{
printf(“get
it
,get
it\n”);
break;
}
}
printf(“hi,it’s
the
client,I
have
recieve
message
:’hello,welcome’
from
server”);
close(clifd);
return
0;
}
/////////////////////////握卖指////////
错误1:bzero(&servaddr,sizeof(servaddr));
//刚赋值又清0,why?
错误2:servaddr.sin_port
=
htons(PORT);//你要连的是serverport
其他的错误懒得说了,自己看吧.累死我了
linux-u4p5:~/test/socket/server # ./client
connect ok,waiting for the server’s message back
程陵神衡绝序好像没看出问题来啊
会不尺拦亏会是防火墙设置问题?
linux socket框架的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux socket框架,深入理解 Linux Socket 框架,linux C语言编程,socket实现的即使通讯系统,linux下socket编程,菜鸟求解。的信息别忘了在本站进行查找喔。
四川成都云服务器租用托管【创新互联】提供各地服务器租用,电信服务器托管、移动服务器托管、联通服务器托管,云服务器虚拟主机租用。成都机房托管咨询:13518219792
创新互联(www.cdcxhl.com)拥有10多年的服务器租用、服务器托管、云服务器、虚拟主机、网站系统开发经验、开启建站+互联网销售服务,与企业客户共同成长,共创价值。
当前文章:深入理解LinuxSocket框架(linuxsocket框架)
文章位置:http://www.shufengxianlan.com/qtweb/news35/191485.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联