當前位置:首頁 » 編程軟體 » linux編程網

linux編程網

發布時間: 2023-09-03 18:26:32

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

熱點內容
java滑鼠事件 發布:2024-11-20 04:52:21 瀏覽:867
cdn緩存過期時間 發布:2024-11-20 04:46:40 瀏覽:408
安卓什麼牌子的藍牙耳機性比價高 發布:2024-11-20 04:42:24 瀏覽:106
安卓壁紙哪個好知乎 發布:2024-11-20 04:41:16 瀏覽:406
演算法證書 發布:2024-11-20 04:41:06 瀏覽:747
windows7如何訪問共享文件 發布:2024-11-20 04:38:55 瀏覽:784
200台電腦無盤需要哪些伺服器 發布:2024-11-20 04:33:58 瀏覽:195
學而思網校app適配安卓哪個版本 發布:2024-11-20 04:29:18 瀏覽:994
廣州社保密碼是多少 發布:2024-11-20 04:29:18 瀏覽:196
校園一卡通查詢密碼多少 發布:2024-11-20 04:26:57 瀏覽:508