linux编程网
❶ linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 。。谢谢
server:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
#define MAXDATASIZE 1024
#define SERVPORT 19999
#define BACKLOG 10
int SendFileToServ(const char *path, const char *FileName, const char *ip)
{
#define PORT 20002
int sockfd;
int recvbytes;
char buf[MAXDATASIZE];
char send_str[MAXDATASIZE];
char filepath[128] = {0};
struct sockaddr_in serv_addr;
FILE *fp;
sprintf(filepath, "%s%s", path, FileName);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return 1;
}
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
inet_aton(ip, &serv_addr.sin_addr);
int IErrCount = 0;
again:
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
if (5 == IErrCount)
return 1;
IErrCount++;
perror("connect");
sleep(2);
goto again;
}
//if ((fp = fopen(FileName, "rb")) == NULL)
if ((fp = fopen(filepath, "rb")) == NULL)
{
perror("fopen ");
return 1;
}
recvbytes = write(sockfd, FileName, strlen(FileName));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (!memcmp(buf, "sendmsg", 7))
{
while(fgets(send_str, MAXDATASIZE, fp))
{
recvbytes = write(sockfd, send_str, strlen(send_str));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (recvbytes <= 0)
{
fclose(fp);
close(sockfd);
return 1;
}
if (memcmp(buf, "goon", 4))
{
fclose(fp);
close(sockfd);
return 1;
}
}
recvbytes = write(sockfd, "end", 3);
}
else
{
fclose(fp);
close(sockfd);
return 1;
}
memset(buf, 0, MAXDATASIZE);
if (read(sockfd, buf, MAXDATASIZE) <= 0)
{
close(sockfd);
return 2;
}
char *Eptr = "nginx reload error";
//printf("bf[%s]\n", buf);
int ret;
ret = strncmp(buf, Eptr, strlen(Eptr));
//printf("%d\n", ret);
if (!ret)
{
close(sockfd);
return 2;
}
close(sockfd);
return 0;
}
int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// 请在循环体中判断,如果re_conf == 1,请再次加载配置文件。
}
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/apuserv.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}
int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth)
{
sscanf(buf, "%s %s %s", pth, FileName, str);
printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str);
return 0;
}
int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"apuserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "apuserv is already running\n");
syslog(LOG_INFO,"apuserv is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
int nret;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
char str[16] = {0};
char FileName[128] = {0};
char path[128] = {0};
MyHandleBuff(buff, str, FileName, path);
if (recvbytes > 0)
{
nret = SendFileToServ(path, FileName, str);
printf("nret[%d]\n", nret);
if (1 == nret)
write(client_fd, "send file error", 15);
else if(2 == nret)
write(client_fd, "reload nginx error", 18);
else
write(client_fd, "succ", 4);
}
close(client_fd);
}
}
_________________________________________________
client:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
#define MAXDATASIZE 1024
#define SERVPORT 20002
#define BACKLOG 10
int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// ????·???????1nf == 1£???′μ?????
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/dstserver.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}
int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"dstserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "dstserver is already running\n");
syslog(LOG_INFO,"dstserver is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
char filepath[MAXDATASIZE]= {0};
FILE *fp;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
sprintf(filepath, "/etc/nginx/url_rule/%s", buff);
if ((fp = fopen(filepath, "wb")) == NULL)
{
perror("fopen");
close(client_fd);
continue;
}
write(client_fd, "sendmsg", 7);
while(read(client_fd, buff, MAXDATASIZE))
{
if (!memcmp(buff, "end", 3))
{
fclose(fp);
break;
}
else
{
fprintf(fp, "%s", buff);
write(client_fd, "goon", 4);
}
}
//system("nginx -s reload");
char *Sptr = "nginx reload succ";
char *Eptr = "nginx reload error";
int ret;
ret = system("nginx -s reload");
printf("ret[%d]\n", ret);
if (ret != 0)
{
write(client_fd, Eptr, strlen(Eptr));
}
else
{
write(client_fd, Sptr, strlen(Sptr));
}
close(client_fd);
}
}
以前写的:内容忘记了。不是很复杂你可以自己看!
❷ linux网络编程是个什么样的东西
Linux 网络编程是一个基于客户端/服务器(即:client/server)的套接字编程结构(即:socket 编程)。
在Linux网络编程的过程中,使用到的协议主要有:TCP/IP(基于连接的协议)、UDP(基于无连接的协议)、ICMP(通常我们在 DOS 状态下通过使用 ping 命令,检查网络的通断,就是依靠该协议)。
在Linux系统的套接字编程中,有标准的 socket( )、client( ) 代码的编写风格。涉及到的主要库函数有:bind( )、listen( )、accept( )、read( )、write( ) 等。
至于说要想学习详细的Linux网络编程技术实现细节,你可以参考《TCP/IP详解》一书。一套共三本。
❸ LINUX网络编程TCP服务器 客户端 有乱码怎么解决
解决办法:
1.在客户端n=read(socketfd,buff,1023);代码之前加上memset(buff,0,sizeof(buff));,这是保证收到较短数据(使用TCP你不能保证每次接收的数据和发送的数据时等长的),打印也是正确的;
2.将客户端buff[n+1]+='\0';修改为buff[n]='\0';,这是因为n是下标,已经是最后一个位置了;
3.将服务器端buff[n+1]+='\0';修改为buff[n]='\0';,这是因为n是下标,已经是最后一个位置了,而且和第2)一样,那个加号也要去掉,应该是笔误吧;
4.最大的问题,将服务器端write(connectfd,buff,1023);,你怎么能够保证收到1023个字符呢?也应该将while中条件移出作为WHILE中的一条语句,而且加上前面所述的memset语句,而将这里的write(connectfd,buff,1023);修改为write(connectfd,buff,strlen(buff))。
祝共同进步!
❹ unix/linux网络编程开发和unix/linux服务器开发有什么区别
1、unix/linux网络编程是一类编程技术(一般指socket相关的编程)。
2、unix/linux服务器是一种服务系统(它是指向客户端提供某种服务的一套应用系统,如ftp服务器、http服务器等)。
3、unix/linux服务器的开发(一套应用系统的开发)通常要用到unix/linux网络编程技术。
❺ Linux网络编程的目录
第1篇Linux网络开发基础
第1章Linux操作系统概述 2
1.1Linux发展历史 2
1.1.1Linux的诞生和发展 2
1.1.2Linux名称的由来 3
1.2Linux的发展要素 3
1.2.1UNIX操作系统 4
1.2.2Minix操作系统 4
1.2.3POSIX标准 4
1.3Linux与UNIX的异同 5
1.4操作系统类型选择和内核版本的选择 5
1.4.1常见的不同公司发行的Linux异同 6
1.4.2内核版本的选择 6
1.5Linux的系统架构 7
1.5.1Linux内核的主要模块 7
1.5.2Linux的文件结构 9
1.6GNU通用公共许可证 10
1.6.1GPL许可证的历史 10
1.6.2GPL的自由理念 10
1.6.3GPL的基本条款 11
1.6.4关于GPL许可证的争议 12
1.7Linux软件开发的可借鉴之处 12
1.8小结 13
第2章Linux编程环境 14
2.1Linux环境下的编辑器 14
2.1.1vim使用简介 14
2.1.2使用vim建立文件 15
2.1.3使用vim编辑文本 16
2.1.4vim的格式设置 18
2.1.5vim配置文件.vimrc 19
2.1.6使用其他编辑器 19
2.2Linux下的GCC编译器工具集 19
2.2.1GCC简介 19
2.2.2编译程序的基本知识 21
2.2.3单个文件编译成执行文件 22
2.2.4编译生成目标文件 22
2.2.5多文件编译 23
2.2.6预处理 24
2.2.7编译成汇编语言 24
2.2.8生成和使用静态链接库 25
2.2.9生成动态链接库 26
2.2.10动态加载库 29
2.2.11GCC常用选项 31
2.2.12编译环境的搭建 33
2.3Makefile文件简介 34
2.3.1一个多文件的工程例子 34
2.3.2多文件工程的编译 36
2.3.3Makefile的规则 37
2.3.4Makefile中使用变量 39
2.3.5搜索路径 43
2.3.6自动推导规则 44
2.3.7递归make 44
2.3.8Makefile中的函数 46
2.4用GDB调试程序 47
2.4.1编译可调试程序 48
2.4.2使用GDB调试程序 49
2.4.3GDB常用命令 52
2.4.4其他的GDB 59
2.5小结 60
第3章文件系统简介 61
3.1Linux下的文件系统 61
3.1.1Linux下文件的内涵 61
3.1.2文件系统的创建 62
3.1.3挂接文件系统 64
3.1.4索引节点inode 65
3.1.5普通文件 66
3.1.6设备文件 66
3.1.7虚拟文件系统VFS 68
3.2文件的通用操作方法 72
3.2.1文件描述符 72
3.2.2打开创建文件open()、create()函数 72
3.2.3关闭文件close()函数 76
3.2.4读取文件read()函数 77
3.2.5写文件write()函数 79
3.2.6文件偏移lseek()函数 80
3.2.7获得文件状态fstat()函数 83
3.2.8文件空间映射mmap()函数 85
3.2.9文件属性fcntl()函数 88
3.2.10文件输入输出控制ioctl()函数 92
3.3socket文件类型 93
3.4小结 93
第4章程序、进程和线程 94
4.1程序、进程和线程的概念 94
4.1.1程序和进程的差别 94
4.1.2Linux环境下的进程 95
4.1.3进程和线程 96
4.2进程产生的方式 96
4.2.1进程号 96
4.2.2进程复制fork() 97
4.2.3system()方式 98
4.2.4进程执行exec()函数系列 99
4.2.5所有用户态进程的产生进程init 100
4.3进程间通信和同步 101
4.3.1半双工管道 101
4.3.2命名管道 107
4.3.3消息队列 108
4.3.4消息队列的一个例子 114
4.3.5信号量 116
4.3.6共享内存 121
4.3.7信号 124
4.4Linux下的线程 127
4.4.1多线程编程实例 127
4.4.2Linux下线程创建函数pthread_create() 129
4.4.3线程的结束函数pthread_join()和pthread_exit() 129
4.4.4线程的属性 130
4.4.5线程间的互斥 132
4.4.6线程中使用信号量 133
4.5小结 136
第2篇Linux用户层网络编程
第5章TCP/IP协议族简介 138
5.1OSI网络分层介绍 138
5.1.1OSI网络分层结构 138
5.1.2OSI的7层网络结构 139
5.1.3OSI参考模型中的数据传输 140
5.2TCP/IP协议栈 141
5.2.1TCP/IP协议栈参考模型 141
5.2.2主机到网络层协议 143
5.2.3IP协议 144
5.2.4网际控制报文协议(ICMP) 146
5.2.5传输控制协议(TCP) 150
5.2.6用户数据报文协议(UDP) 154
5.2.7地址解析协议(ARP) 156
5.3IP地址分类与TCP/UDP端口 158
5.3.1因特网中IP地址的分类 159
5.3.2子网掩码(subnetmaskaddress) 161
5.3.3IP地址的配置 162
5.3.4端口 163
5.4主机字节序和网络字节序 163
5.4.1字节序的含义 164
5.4.2网络字节序的转换 164
5.5小结 166
第6章应用层网络服务程序简介 167
6.1HTTP协议和服务 167
6.1.1HTTP协议概述 167
6.1.2HTTP协议的基本过程 168
6.2FTP协议和服务 170
6.2.1FTP协议概述 170
6.2.2FTP协议的工作模式 172
6.2.3FTP协议的传输方式 172
6.2.4一个简单的FTP过程 173
6.2.5常用的FTP工具 173
6.3TELNET协议和服务 174
6.3.1远程登录的基本概念 174
6.3.2使用TELNET协议进行远程登录的工作过程 174
6.3.3TELNET协议 174
6.4NFS协议和服务 176
6.4.1安装NFS服务器和客户端 176
6.4.2服务器端的设定 176
6.4.3客户端的操作 177
6.4.4showmount命令 177
6.5自定义网络服务 177
6.5.1xinetd/inetd 178
6.5.2xinetd服务配置 178
6.5.3自定义网络服务 179
6.6小结 180
第7章TCP网络编程基础 181
7.1套接字编程基础知识 181
7.1.1套接字地址结构 181
7.1.2用户层和内核层交互过程 183
7.2TCP网络编程流程 184
7.2.1TCP网络编程架构 184
7.2.2创建网络插口函数socket() 186
7.2.3绑定一个地址端口对bind() 189
7.2.4监听本地端口listen 192
7.2.5接受一个网络请求accept() 194
7.2.6连接目标网络服务器connect() 199
7.2.7写入数据函数write() 200
7.2.8读取数据函数read() 201
7.2.9关闭套接字函数close() 201
7.3服务器/客户端的简单例子 202
7.3.1例子功能描述 202
7.3.2服务器网络程序 203
7.3.3服务器读取和显示字符串 205
7.3.4客户端的网络程序 205
7.3.5客户端读取和显示字符串 206
7.3.6编译运行程序 206
7.4截取信号的例子 207
7.4.1信号处理 207
7.4.2信号SIGPIPE 208
7.4.3信号SIGINT 208
7.5小结 208