当前位置:首页 » 操作系统 » linuxsocket服务

linuxsocket服务

发布时间: 2023-06-12 03:29:07

linux下的socket是怎么回事,如何利用其实现局域网内的数据处理

//服务端server.c
#include
<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<string.h>
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<sys/socket.h>
#include
<sys/wait.h>
#define
SERVPORT
6000
/*服务器监听端口号
*/
#define
BACKLOG
10
/*
最大同时连接请求数
*/
#define
MAXDATASIZE
100
main()
{
char
buf[MAXDATASIZE];
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[recvbytes]
=
'\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<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<string.h>
#include
<netdb.h>
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<sys/socket.h>
#define
SERVPORT
6000
#define
MAXDATASIZE
100
main(int
argc,
char
*argv[])
{
int
sockfd,
recvbytes;
char
buf[MAXDATASIZE];
struct
hostent
*host;
struct
sockaddr_in
serv_addr;
if
(argc
<
2)
{
fprintf(stderr,"Please
enter
the
server's
hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出错!");
exit(1);
}
if
((sockfd
=
socket(AF_INET,
SOCK_STREAM,
0))
==
-1)
{
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr
=
*((struct
in_addr
*)host->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[recvbytes]
=
'\0';
printf("Received:
%s",buf);
close(sockfd);
}

❷ linux之socket , URL 访问http服务器

给提供一个指导步骤:

1、修改socket服务端口为80/443;

2、申请一个域名并配置IP和域名的映射,如是本地的话,请把服务器主机名和IP地址在开发机器上做一个映射即可,如是linux机器,请在/etc/hosts文件添加如下信息,

ipmapping_hostname

❸ Linux socket服务的问题

1 换个端口试试!

2.要是老是出错,把socket打出来看看,是不是

真有客户端连上,并打出客户端的ip地址。看是不

是来自统一台机器。

❹ linux虚拟机进行socket通信要如何设置

请终端下输入
sudo netstat -a
如果看到了,如果能看到很多unix的链接流。则证明linux系统本身已经启用了很多socket通信。已经是设置好的。
至于如何进行socket通信编程。请寻找相关资料自学。

如果你只是想建立到远端服务器的一个ip隧道。架设加密代理的隧道,那么请告知你使用的linux版本,以及使用的软件。

❺ Linux 进程间套接字通信(Socket)基础知识

姓名:罗学元    学号:21181214375    学院:广州研究院

【嵌牛导读】Linux进程间套接字通信基础

【嵌牛鼻子】Linux 进程间套接字及通信介绍

【嵌牛提问】Linux进程间套接字包含哪些内容,如何实现通信

一、套接字(Socket)通信原理

套接字通信允许互联的位于不同计算机上的进程之间实现通信功能。

二、套接字的属性

套接字的特性由3个属性确定,它们分别是:域、类型和协议。

1. 套接字的域

它指定套接字通信中使用的网络介质,最常见的套接字域是AF_INET,它指的是Internet网络。当客户使用套接字进行跨网络的连接时,它就需要用到服务器计算机的IP地址和端口来指定一台联网机器上的某个特定服务,所以在使用socket作为通信的终点,服务器应用程序必须在开始通信之前绑定一个端口,服务器在指定的端口等待客户的连接。

另一个域AF_UNIX表示UNIX文件系统,就是文件输入/输出,它的地址就是文件名。

2. 套接字类型

因特网提供了两种通信机制:流(stream)和数据报(datagram),因而套接字的类型也就分为流套接字和数据报套接字。我们主要看流套接字。

流套接字由类型SOCK_STREAM指定,它们是在AF_INET域中通过TCP/IP连接实现,同时也是AF_UNIX中常用的套接字类型。

流套接字提供的是一个有序、可靠、双向字节流的连接,因此发送的数据可以确保不会丢失、重复或乱序到达,而且它还有一定的出错后重新发送的机制。

与流套接字相对的是由类型SOCK_DGRAM指定的数据报套接字,它不需要建立连接和维持一个连接,它们在AF_INET中通常是通过UDP/IP实现的。它对可以发送的数据的长度有限制,数据报作为一个单独的网络消息被传输,它可能丢失、复制或错乱到达,UDP不是一个可靠的协议,但是它的速度比较高,因为它并不需要总是要建立和维持一个连接。

3.套接字协议

只要底层的传输机制允许不止一个协议来提供要求的套接字类型,我们就可以为套接字选择一个特定的协议。通常只需要使用默认值。

三、套接字地址

每个套接字都有其自己的地址格式,对于AF_UNIX域套接字来说,它的地址由结构sockaddr_un来描述,该结构定义在头文件

struct sockaddr_un{

sa_family_t sun_family;  //AF_UNIX,它是一个短整型

char sum_path[];  //路径名

};

对于AF_INET域套接字来说,它的地址结构由sockaddr_in来描述,它至少包括以下几个成员:

struct sockaddr_in{

short int sin_family;  //AN_INET

unsigned short int sin_port;  //端口号

struct in_addr sin_addr;    //IP地址

}

而in_addr被定义为:

struct in_addr{

unsigned long int s_addr;

}

四、基于流套接字的客户/服务器的工作流程

使用socket进行进程通信的进程采用的客户/服务器系统是如何工作的呢?

1.服务器端

首先,服务器应用程序用系统调用socket来创建一个套接字,它是系统分配给该服务器进程的类似文件描述符的资源,它不能与其他的进程共享。

接下来,服务器进程会给套接字起个名字,我们使用系统调用bind来给套接字命名。然后服务器进程就开始等待客户连接到这个套接字。

然后,系统调用listen来创建一个队列,并将其用于存放来自客户的进入连接。

最后,服务器通过系统调用accept来接受客户的连接。它会创建一个与原有的命名套接不同的新套接字,这个套接字只用于与这个特定客户端进行通信,而命名套接字(即原先的套接字)则被保留下来继续处理来自其他客户的连接。

2.客户端

基于socket的客户端比服务器端简单。同样,客户应用程序首先调用socket来创建一个未命名的套接字,然后讲服务器的命名套接字作为一个地址来调用connect与服务器建立连接。

一旦连接建立,我们就可以像使用底层的文件描述符那样用套接字来实现双向数据的通信。

❻ Linux socket 服务端 客户端 怎么开启在一个机器上运行 接收通讯完全的新手啊!!!什么都不会的说。

你先编译你的服务端程序,然后执行。。。这时相当于你的服务器就启动了。
然后编译你的客户端程序,执行时后面跟上任意参数。。。你就会看到结果的。。。

这应该是socket里的第一个简单例子。。。看书把socket的一些相关api弄懂。。。~!

❼ linux socket是什么意思

基于Linux的SOCKET编程。

❽ linux下socket编程,只需要实现服务器端能接收多个用户端发来的消息这个功能就行,求代码,最好有相应解释

这些都是自己写的,由于我很粗心调试了好久,要是有任何问题我都可以帮你解决,包教会,而且可以进一步一起完善他的功能

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/time.h>

#define BUFF_SIZE 1024
#define PORT 8888
#define LSN_NUM 10

int main()
{
int sockfd = -1;
int clt_sockfd = -1;
int i = 0, fd;
fd_set inset, tmp_inset;
struct sockaddr_in *server_addr, *client_addr;
int addr_len = sizeof(struct sockaddr_in);
int len;
char buff[BUFF_SIZE];

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 1){
printf("Create socket error!\n");
exit(0);
}else{
printf("Create socket success! sockfd = %d\n", sockfd);
}

server_addr = malloc(addr_len);
client_addr = malloc(addr_len);
memset(server_addr, 0, sizeof(server_addr));
memset(client_addr, 0, sizeof(client_addr));
server_addr->sin_family = AF_INET;
server_addr->sin_port = htons(PORT); //此处要将主机字节序转为网络字节序
server_addr->sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr*)server_addr, sizeof(struct sockaddr_in)) < 0){
printf("Bind error!\n");
exit(0);
}else{
printf("Bind success!\n");
}

if(listen(sockfd, LSN_NUM) < 0){
printf("Listen error!\n");
exit(0);
}else{
printf("Listen success!\n");
}

printf("Waiting for connect ...\n");

i = 1;
FD_ZERO(&inset);
FD_SET(sockfd, &inset);
while(1){
printf("------ The %dth turning ------- \n", i++);
tmp_inset = inset;
memset(buff, 0, BUFF_SIZE);
//select
if(select(FD_SETSIZE, &tmp_inset, NULL, NULL, NULL) <= 0){
printf("Select failed!\n");
exit(0);
}else{
printf("Select success!\n");
}//end select
for(fd = 0; fd < FD_SETSIZE; fd++){
if(FD_ISSET(fd, &tmp_inset) > 0){
printf("crrent fd: %d\n", fd);
if(sockfd == fd){
if((clt_sockfd = accept(sockfd, (struct sockaddr*)client_addr, &addr_len)) < 0){
printf("Accept error!\n");
exit(0);
}else{
printf("Get connection from %s, port: %d. socket: %d\n", \
inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port), clt_sockfd);
}
FD_SET(clt_sockfd, &inset);
}else{
if((len = recv(fd, buff, BUFF_SIZE, 0)) < 0){
printf("Recv failed!\b");
close(fd);
FD_CLR(fd, &inset);
}else if(0 == len || !strncmp("quit", buff, 4)){
printf("Clt_sockfd %d has quited!\n", clt_sockfd);
close(fd);
FD_CLR(fd, &inset);
continue;
}else{
printf("Clt_sockfd %d got message: %s\n", clt_sockfd, buff);
}
}
}
}
continue;
}
}
free(server_addr);
free(client_addr);

}

❾ linux下,socket服务器和客户端TCP方式建立了连接,如何使它们之间相互发送消息

1.可能是在获取客户端的ip和端口时,处理出现问题,导致无法正确发送到客户端。
2.客户端是否使用固定的端口来接收服务器信息,或服务器是否正确发送到客户端的相应的端口。
3.通过上面分析,最大可能是在处理端口出现问题,请重新检查。
4.实在不行,最好使用抛出异常方法来捕获错误消息,或是通过一步一步调试分析数据发送过程。

热点内容
玩和平精英的时候服务器发呆了怎么办 发布:2025-04-05 11:02:40 浏览:382
怎么把苹果的号转到安卓手机上 发布:2025-04-05 10:39:05 浏览:533
存储核心架构瓶颈已被攻破 发布:2025-04-05 10:38:27 浏览:308
空间新算法 发布:2025-04-05 10:33:21 浏览:708
蜀门和远征哪个配置低 发布:2025-04-05 10:23:50 浏览:288
linux下jdk的安装 发布:2025-04-05 10:12:20 浏览:70
单机江湖脚本 发布:2025-04-05 10:08:32 浏览:767
爱奇艺离线缓存怎么传蓝牙 发布:2025-04-05 10:00:48 浏览:143
阿里云服务器内存超频 发布:2025-04-05 10:00:48 浏览:578
如何登录pubg国际服安卓手机 发布:2025-04-05 09:40:07 浏览:414