当前位置:首页 » 操作系统 » linuxsocket源码

linuxsocket源码

发布时间: 2022-08-28 03:22:37

㈠ socket,linuxc语言实现

不难吧,我给你说下流程
客户端
1、创建socket套接子s
2、用s连接到服务端,connect这个函数,成功返回0,错误 -1;
3、可以发送和接收数据,看你是面向连接还是无连接的了,具体的你自己处理
服务端
1、创建socket,比如s
2、绑定端口和本级IP。bind
3、listen。监听端口
4、accept,接受服务端连接,如果成功的话会返回一个新套接字的,比如s1,你可以利用s1和客户端进行通信,接收和发送和客户端的一样

还有需要提醒的是,你使用面向无连接的时候客户端和服务端差不多是一样的工作流程,都和上边服务端工作模式一样

㈡ linux socket编程代码解析

很简单的一个socket server端和client端通信程序啊!
server端监听端口,client主动连接server端,连接上后client端先将student这样一个结构体数据发送给server端,server端线接受这个结构体数据,然后再向client端发送这个student结构体数据,client端接收。
ok,通信过程完成。

㈢ linux编程socket程序的编译语句

server端:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include<string.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAX_LINE 100

int main()
{
struct sockaddr_in server;
struct sockaddr_in client;

int server_fd;
int client_fd;

socklen_t len;

char buf[MAX_LINE]; //用于存储传送内容到缓冲区
char addr_ip[INET_ADDRSTRLEN];//存储客户端地址缓冲区
int port = 8000;//端口号8000
int n; //读写字节数

bzero(&server,sizeof(server));//清空地址结构
server.sin_family = AF_INET;//使用ipv4
server.sin_addr.s_addr = INADDR_ANY;//服务器可以接受任意地址
server.sin_port = htons(port);//把端口号转成网络字节序

server_fd = socket(AF_INET,SOCK_STREAM,0);//创立套接字,使用tcp协议
bind(server_fd,(struct sockaddr *)&server,sizeof(server));//将地址和套接字绑定
listen(server_fd,10);//开始监听

printf("waiting```\n");

while(1)
{
client_fd = accept(server_fd,(struct sockaddr *)&client,&len);
n = read(client_fd,buf,MAX_LINE);//读取客户端来的消息
inet_ntop(AF_INET,&client.sin_addr,addr_ip,sizeof(addr_ip));

printf("client ip is : %s , port is : %d\n",addr_ip,ntohs(client.sin_port));
printf("content is : %s\n",buf);//打印客户端信息

write(client_fd,buf,n);//转发回去给客户端
close(client_fd);
}

if(close(client_fd) == -1)
{
perror("fail to close");
exit(1);
}

return 0;
}

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

#define MAX_LINE 100

int main(int argc,char * argv[])
{
struct sockaddr_in server;//服务器地址
char buf[MAX_LINE];

int server_fd;
int port = 8000;

char *str = "test string";//默认字符串

if(argc > 1)
{
str = argv[1];//从命令参数中取得用户输入的串
}

bzero(&server,sizeof(server));//清空地址结构

server.sin_family = AF_INET;//使用ipv4

inet_pton(AF_INET,"192.168.228.129",&server.sin_addr);
server.sin_port = htons(port);

server_fd = socket(AF_INET,SOCK_STREAM,0);//创建套接字

connect(server_fd,(struct sockaddr *)&server,sizeof(server));

write(server_fd,str,strlen(str) + 1);
//因为是本机测试,所以不用考虑延时
read(server_fd,buf,MAX_LINE);

printf("recieve from server :%s\n",buf);
close(server_fd);

return 0;
}

//源码来自于网络,谁写也都类似,都是基于tcp的三次握手协议来写的

㈣ linux socket网络编程学完看哪些源码

要看的东西实在是太多了,不如来培训一下吧。

㈤ 求 Linux下socket编程,用于传递文件,并且用CRC校验的源代码!

把CRC写入文件,然后再传输文件。
接收的部分,先收完文件,再从文件中读出CRC进行判断。不成功则报错,丢弃文件。

㈥ Linux中C语言的一个函数的源代码:socket 编程中的 recv() 函数。

1、recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态。
2、recv函数只是在用户空间定义的。内核空间有与之对应的函数,也就是说,执行recv函数就会调用到内核中与它对应的函数,实际起作用的就是内核里的这个函数。至于内核里调用的是那个函数,内核里的调用关系复杂的很,除非对内核非常了解的,才会找到到底是怎么调用的,他也是只是找到怎么调用的。

㈦ 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);

}

热点内容
hp存储6350 发布:2025-05-15 05:40:41 浏览:231
怎么更改电脑默认缓存位置 发布:2025-05-15 05:39:01 浏览:875
安卓qq公孙离在哪个战区战力最低 发布:2025-05-15 05:38:58 浏览:491
androidffmpeg压缩 发布:2025-05-15 05:37:02 浏览:286
ftp简称是 发布:2025-05-15 05:37:02 浏览:119
光遇发光耳机怎么设置安卓 发布:2025-05-15 05:32:03 浏览:112
台电安卓平板系统太低怎么办 发布:2025-05-15 05:20:00 浏览:508
安装了zlib编译报错 发布:2025-05-15 05:19:56 浏览:167
二分算法无序 发布:2025-05-15 05:18:22 浏览:29
网易我的世界服务器组件怎么安装 发布:2025-05-15 05:16:58 浏览:312