linux下的 socket编程问题!
发布网友
发布时间:2022-04-30 20:33
我来回答
共3个回答
热心网友
时间:2023-10-10 23:31
第一个问题:
对,是那样的,用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[BUF_LEN] = {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[BUF_LEN] = {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[1], fd);
return 0;
}
热心网友
时间:2023-10-10 23:31
1你就打开文件,然后一个字符一个字符的读文件,然后一个字符一个字符的接收,再一个字符一个字符写入文件就行了阿
2这个问题你问的有点模糊,服务器端的编程有很多方式,也不是要每来个连接就要创建一个进程的。
热心网友
时间:2023-10-10 23:32
挖~
同烂
linux系统中socket编程错误码:eintr和eagain的处理方法
EAGAIN错误常见于非阻塞系统调用,表示由于资源限制或条件未满足,无法完成操作。处理EINTR错误的三种方法包括:重启被中断的系统调用、在信号处理时设置SA_RESTART属性、忽略信号。解决EAGAIN错误则需关注资源限制或条件满足情况,如调整非阻塞操作策略。Linux下,非阻塞socket编程时出现的Resource temporarily unava...
Linux编程socket通信疑问
在Linux编程中,socket通信是一种非常重要的机制,用于在不同进程之间或者不同主机之间传输数据。Socket可以被看作是一个端点,它允许程序通过网络通信协议(如TCP/IP、UDP等)进行数据传输。在socket通信中,通常涉及两个主要的步骤:建立连接和数据传输。首先,客户端和服务器端都需要创建一个socket对象,...
linux系统中socket编程错误码:eintr和eagain的处理方法
在Linux系统中,socket编程中两种常见的错误码——eintr和eagain,是我们在网络编程中不得不面对的挑战。它们分别代表不同的问题,需要我们采取不同的策略来妥善处理。本文将深入探讨这两种错误的含义、原因以及各自的处理方法。首先,我们来理解什么是慢系统调用。这些调用可能会在操作网络、特殊设备或进行长...
linux中socket编程服务端启动,客户端启动是出现错误:connection refuse(1...
你的servaddr里的IP地址或PORT端口号设置错了吧。服务端和客户端的简单里子请参考:http://blog.csdn.net/flynetcn/article/details/5829258
linux下的 socket编程问题!
第一个问题:对,是那样的,用open打开文件,用read读取文件,在发送给对方,接收方接收到后,写入文件就可以了。不过在这个过程中最好别用字符串函数,除非你很熟悉。第二个问题 首先你得去搞清楚什么是线程,什么是进程,fork出来的叫进程,pthread_create出来的才叫线程。服务器有很多种模型(多进程,...
关于socket编程问题,100分急求
1、首先若大量包裹是一起发的,完全不用操心这个问题,客户端发完包时会close链接,此时会发一个FIN信息表示已经发送完毕,这时服务器会自动收到FIN信息知道客户端完成发包完成了。而这些操作都是在socket api级别完成的,不用额外发一个EOF标志。2、客户端包大于服务器缓冲区,这也不是你操心的,api...
Linux下C语言Socket编程问题?(高手进)
网络断开如拔掉网线时,系统程序一般是检测不出来的,尤其是广域网上。建议连接时设置linger属性,如果网络不通,能迅速决断立即返回失败错误。LINGER oLinger;oLinger.l_onoff = 1;oLinger.l_linger = 0;setsockopt(m_Socket,SOL_SOCKET,SO_LINGER,(char *)&oLinger,sizeof(oLinger));...
Linux编程socket通信疑问
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者...答案就在这里:linux socket 通信编程 ---Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的...
linux阻塞与非阻塞linux阻塞非阻塞
以linux下tcpsocket编程为例:阻塞就是recv/read的时候socket接收缓冲区要是有数据就读,没数据我就一直睡觉赖着不走,直到有数据来了读完我才走。send/write的时候,要是发送缓冲区满了,没有空间继续发送了我也一直睡觉赖着不走,直到发送缓冲区腾出足够的空间让我把数据全部塞到发送缓冲区里我才走...
深度剖析linux socket的epollin/epollout是何时触发的
深入探讨Linux Socket的epollin/epollout触发机制:在EPOLLET模式下,理解socket的EPOLLIN和EPOLLOUT何时触发是关键。EPOLLIN代表可读事件,当有新的TCP数据到达时,这个事件会触发,这是通过内核的sk->sk_data_ready函数通知epoll的。让我们通过一个实例来分析。编写一个服务端程序,当客户端连接并发送数据时...