socket编程linux(linux下的 socket编程问题!)

2026-08-19 07:15:01 :0

socket编程linux(linux下的  socket编程问题!)

大家好,今天小编来为大家解答以下的问题,关于socket编程linux,linux下的 socket编程问题!这个很多人还不知道,现在让我们一起来看看吧!

本文目录

linux下的 socket编程问题!

第一个问题:
对,是那样的,用open打开文件,用read读取文件,在发送给对方,接收方接收到后,写入文件就可以了。不过在这个过程中最好别用字符串函数,除非你很熟悉。
第二个问题
首先你得去搞清楚什么是线程,什么是进程,fork出来的叫进程,pthread_create出来的才叫线程。服务器有很多种模型(多进程,多线程,select,epoll模型,这个我的blog上有,famdestiny.cublog.cn),不一定要用多进程。
给你写了个代码,自己先看看:
注意,在自己的目录下创建一个叫pserverb的文件,程序会把这个文件复制成test文件。你可以自己根据需要改改
server:
#include 《stdio.h》
#include 《sys/socket.h》
#include 《netinet/in.h》
#include 《errno.h》
#include 《signal.h》
#include 《sys/wait.h》
#include 《sys/types.h》
#include 《string.h》
#include 《stdlib.h》
#include 《sys/stat.h》
#include 《fcntl.h》
#include 《unistd.h》
#define SERV_PORT 5358
#define MAX_CONN 10
#define BUF_LEN 1024
void str_echo(FILE *fp, int sockfd){
ssize_t nread;
int file_fd;
char buf = {0};
file_fd = open("test", O_WRONLY | O_TRUNC | O_CREAT, 0755);
while(1) {
bzero(buf, BUF_LEN);
if((nread = read(sockfd, buf, BUF_LEN)) == -1) {
if(errno == EINTR) {
continue;
}
else {
printf("readn error: %s\n", strerror(errno));
continue;
}
}
else if (nread == 0) {
break;
}
else {
printf("%s\n", buf);
write(file_fd, buf, nread);
}
}
close(file_fd);
}
void sig_chld(int sig){
pid_t pid;
int state;
while((pid = waitpid(-1, &state, WNOHANG)) 》 0){
printf("child process %d exited.", pid);
}
return;
}
int main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t cliaddrlen;
pid_t childpid;
struct sockaddr_in servaddr, cliaddr;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
printf("socket error: %s\n", strerror(errno));
return 0;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){
printf("bind error: %s\n", strerror(errno));
return 0;
}
if(listen(listenfd, MAX_CONN) == -1){
printf("listen error: %s\n", strerror(errno));
return 0;
}
signal(SIGCHLD, sig_chld);
while(1){
cliaddrlen = sizeof(cliaddr);
if((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen)) == -1){
if(errno == EINTR){
continue;
}
else{
printf("accept error: %s\n", strerror(errno));
continue;
}
}
if((childpid = fork()) == 0){
close(listenfd);
str_echo(stdin, connfd);
exit(0);
}
else if(childpid 》 0){
close(connfd);
}
else{
printf("fork error!\n");
continue;
}
}
}
client:
#include 《stdio.h》
#include 《unistd.h》
#include 《errno.h》
#include 《sys/socket.h》
#include 《netinet/in.h》
#include 《arpa/inet.h》
#include 《string.h》
#include 《sys/stat.h》
#include 《fcntl.h》
#include 《stdlib.h》
#define SERV_ADDR "127.0.0.1"
#define SERV_PORT 5358
#define BUF_LEN 1024
void str_cli(char *path, int sockfd)
{
char sendbuf = {0};
int fd, n;
if((fd = open("./pserverb", O_RDONLY)) == -1){
printf("%s\n", strerror(errno));
exit(0);
}
while((n = read(fd, sendbuf, BUF_LEN)) != 0) {
if(n 《 0){
printf("%s\n", strerror(errno));
exit(0);
}
write(sockfd, sendbuf, n);
bzero(sendbuf, BUF_LEN);
}
close(fd);
return;
}
int main(int argc, char **argv)
{
int fd;
struct sockaddr_in servaddr;
fd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(SERV_ADDR);
servaddr.sin_port = htons(SERV_PORT);
if (connect(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
printf("connect error: %s\n", strerror(errno));
return 0;
}
str_cli(argv, fd);
return 0;
}

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; //用于存储传送内容到缓冲区
char addr_ip;//存储客户端地址缓冲区
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;

int server_fd;
int port = 8000;

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

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

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的三次握手协议来写的

socket编程在windows和linux下的区别

你好,比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:
区别一:windows下需加上WSAStartup()函数
区别二:关闭socket:linux为close(),windows为closesocket()
windows下采用上层的API,一般有CSocket和CAsynSocket这两种类型的类
这种情况以下socket函数一般的首字母大写。而底层的API不管是windows下的还是linux下的socket函数首字母都是小写的。
当然两者还有其他方面的区别和联系,有待以后慢慢学习~!

linux socket编程后是tcp还是udp

Linux socket编程既可以是TCP连接,也可以是UDP连接。Linux socket编程首先要用socket系统调用创建一个套接字,socket系统调用的原型是:
int socket(int domain, int type, int protocol);
当socket函数的type参数指定为SOCK_STREAM时,就相当于建立的是个TCP连接;当type参数指定为SOCK_DGRAM时,建立的就是一个UDP连接。当建立TCP或者UDP连接的时候,注意把第一个参数domain指定为AF_INET。

socket编程在windows和linux下的区别是什么

1. 头文件

windows下winsock.h或winsock2.h


linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)

2. 初始化

windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。


linux下不需要

3. 关闭socket

windows下closesocket(...)


linux下close(...)

4. 类型

windows下SOCKET


linux下int

5. 获取错误码

windows下getlasterror()/WSAGetLastError()


linux下,未能成功执行的socket操作会返回-1;如果包含了errno.h,就会设置errno变量

6. 设置非阻塞

windows下ioctlsocket()


linux下fcntl(),需要头文件fcntl.h

7. send函数最后一个参数

windows下一般设置为0


linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出

8. 毫秒级时间获取

windows下GetTickCount()


linux下gettimeofday()

关于socket编程linux,linux下的 socket编程问题!的介绍到此结束,希望对大家有所帮助。

socket编程linux(linux下的  socket编程问题!)

本文编辑:admin

本文相关文章:


socket编程linux(在Linux系统下编写一个socket程序)

socket编程linux(在Linux系统下编写一个socket程序)

这篇文章给大家聊聊关于socket编程linux,以及在Linux系统下编写一个socket程序对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录在Linux系统下编写一个socket程序socket编程在windows和lin

2025年6月28日 17:45

更多文章:


细胞之间的interaction(细胞间相互作用方式有什么 有什么区别)

细胞之间的interaction(细胞间相互作用方式有什么 有什么区别)

大家好,细胞之间的interaction相信很多的网友都不是很明白,包括细胞间相互作用方式有什么 有什么区别也是一样,不过没有关系,接下来就来为大家分享关于细胞之间的interaction和细胞间相互作用方式有什么 有什么区别的一些知识点,

2026年5月26日 18:45

powder是什么刷子(rt化妆刷怎么样Real Techniques化妆刷怎么样)

powder是什么刷子(rt化妆刷怎么样Real Techniques化妆刷怎么样)

大家好,今天小编来为大家解答以下的问题,关于powder是什么刷子,rt化妆刷怎么样Real Techniques化妆刷怎么样这个很多人还不知道,现在让我们一起来看看吧!本文目录rt化妆刷怎么样Real Techniques化妆刷怎么样zo

2025年5月28日 07:15

u16女足亚洲杯直播(女足亚洲杯半决赛时间直播什么平台能看)

u16女足亚洲杯直播(女足亚洲杯半决赛时间直播什么平台能看)

这篇文章给大家聊聊关于u16女足亚洲杯直播,以及女足亚洲杯半决赛时间直播什么平台能看对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录女足亚洲杯半决赛时间直播什么平台能看哪里有直播中国女子足球队对日本女足亚洲杯半决赛时间直播什么

2026年4月9日 20:45

excel教程进阶(小白学Excel之操作中的常用技巧-Excel学习网)

excel教程进阶(小白学Excel之操作中的常用技巧-Excel学习网)

这篇文章给大家聊聊关于excel教程进阶,以及小白学Excel之操作中的常用技巧-Excel学习网对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录小白学Excel之操作中的常用技巧-Excel学习网EXCEL制作表格技巧Exc

2026年4月22日 12:45

怎么读return(returned怎么读)

怎么读return(returned怎么读)

本篇文章给大家谈谈怎么读return,以及returned怎么读对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录returned怎么读ret

2025年6月13日 01:45

结构体数组交换位置(c语言编程:将一个数组中的值按逆序重新存放,例如,原来顺序为8,6,5,4,3,要求改为3,4,5)

结构体数组交换位置(c语言编程:将一个数组中的值按逆序重新存放,例如,原来顺序为8,6,5,4,3,要求改为3,4,5)

这篇文章给大家聊聊关于结构体数组交换位置,以及c语言编程:将一个数组中的值按逆序重新存放,例如,原来顺序为8,6,5,4,3,要求改为3,4,5对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录c语言编程:将一个数组中的值按逆序

2025年9月14日 12:00

哪些cms可以做小说站(Wordpress、Discuz、KingCMS、MediaWiki各适合建什么样的站)

哪些cms可以做小说站(Wordpress、Discuz、KingCMS、MediaWiki各适合建什么样的站)

本篇文章给大家谈谈哪些cms可以做小说站,以及Wordpress、Discuz、KingCMS、MediaWiki各适合建什么样的站对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录Wordpress、Discuz、KingCM

2026年7月24日 05:30

chief用法(chef是什么意思)

chief用法(chef是什么意思)

其实chief用法的问题并不复杂,但是又很多的朋友都不太了解chef是什么意思,因此呢,今天小编就来为大家分享chief用法的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录chef是什么意思chef和chief的

2026年8月29日 03:15

countif是计算什么的(excel中countif函数的功能是什么)

countif是计算什么的(excel中countif函数的功能是什么)

大家好,countif是计算什么的相信很多的网友都不是很明白,包括excel中countif函数的功能是什么也是一样,不过没有关系,接下来就来为大家分享关于countif是计算什么的和excel中countif函数的功能是什么的一些知识点,

2025年5月29日 21:15

html5可以用在哪些方面(html5可以用来干什么,应用于哪些领域发展前景如何)

html5可以用在哪些方面(html5可以用来干什么,应用于哪些领域发展前景如何)

大家好,今天小编来为大家解答以下的问题,关于html5可以用在哪些方面,html5可以用来干什么,应用于哪些领域发展前景如何这个很多人还不知道,现在让我们一起来看看吧!本文目录html5可以用来干什么,应用于哪些领域发展前景如何html5技

2026年3月11日 15:30

什么不是数据库系统的特点(急求解答题目 :什么不是数据库系统阶段的特点等)

什么不是数据库系统的特点(急求解答题目 :什么不是数据库系统阶段的特点等)

今天给各位分享急求解答题目 :什么不是数据库系统阶段的特点等的知识,其中也会对急求解答题目 :什么不是数据库系统阶段的特点等进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录急求解答题目 :什么不是数据库系统阶段

2025年7月23日 08:45

运算放大器权威指南第五版(单电源运放和双电源运放有什么区别)

运算放大器权威指南第五版(单电源运放和双电源运放有什么区别)

其实运算放大器权威指南第五版的问题并不复杂,但是又很多的朋友都不太了解单电源运放和双电源运放有什么区别,因此呢,今天小编就来为大家分享运算放大器权威指南第五版的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录单电源

2026年5月1日 20:15

流程图的意思流程图的意思是什么?如何画一个简单的程序流程图

流程图的意思流程图的意思是什么?如何画一个简单的程序流程图

大家好,今天小编来为大家解答以下的问题,关于流程图,流程图的意思流程图的意思是什么这个很多人还不知道,现在让我们一起来看看吧!本文目录流程图的意思流程图的意思是什么如何画一个简单的程序流程图一个c语言的流程图 是关于判断素数的 看不太懂 麻

2025年10月13日 11:30

函数图像生成器 网页(有没有一种软件,当你输入数学公式后,软件就可以生成相应的图形(平面的或三维的))

函数图像生成器 网页(有没有一种软件,当你输入数学公式后,软件就可以生成相应的图形(平面的或三维的))

这篇文章给大家聊聊关于函数图像生成器 网页,以及有没有一种软件,当你输入数学公式后,软件就可以生成相应的图形(平面的或三维的)对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录有没有一种软件,当你输入数学公式后,软件就可以生成相

2026年5月26日 16:45

thinkphp后台模板(为什么在thinkphp中的模板里只显示html代码,如图)

thinkphp后台模板(为什么在thinkphp中的模板里只显示html代码,如图)

各位老铁们好,相信很多人对thinkphp后台模板都不是特别的了解,因此呢,今天就来为大家分享下关于thinkphp后台模板以及为什么在thinkphp中的模板里只显示html代码,如图的问题知识,还望可以帮助大家,解决大家的一些困惑,下面

2025年7月25日 16:45

电商程序源码(有没有卖java电商源码的)

电商程序源码(有没有卖java电商源码的)

本篇文章给大家谈谈电商程序源码,以及有没有卖java电商源码的对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录有没有卖java电商源码的电商直播系统源码都要实现哪些功能需求淘宝卖程序源码选什么类目社交电商系统需要连源码一起买么

2025年11月29日 16:00

webservice部署在服务器(如何部署java webservice)

webservice部署在服务器(如何部署java webservice)

各位老铁们好,相信很多人对webservice部署在服务器都不是特别的了解,因此呢,今天就来为大家分享下关于webservice部署在服务器以及如何部署java webservice的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起

2025年12月16日 21:15

decimal转换为int(C#中怎样将decimal转int)

decimal转换为int(C#中怎样将decimal转int)

各位老铁们,大家好,今天由我来为大家分享decimal转换为int,以及C#中怎样将decimal转int的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本

2025年6月3日 04:30

java的graphics详解(Java的Graphics类应该怎么用)

java的graphics详解(Java的Graphics类应该怎么用)

大家好,java的graphics详解相信很多的网友都不是很明白,包括Java的Graphics类应该怎么用也是一样,不过没有关系,接下来就来为大家分享关于java的graphics详解和Java的Graphics类应该怎么用的一些知识点,

2026年8月9日 23:00

serioussam作弊器(英雄萨姆2作弊码不管用啊)

serioussam作弊器(英雄萨姆2作弊码不管用啊)

本篇文章给大家谈谈serioussam作弊器,以及英雄萨姆2作弊码不管用啊对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录英雄萨姆2作弊码不管用啊英雄萨姆2作弊英雄萨姆2作弊码不管用啊先进入游戏,在标题画面下按住SHIFT不放

2026年5月25日 15:45

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索