1.Java如何通过网络进行寻找附近的网络网络设备,附源码?
2.golangç½ç»ç¼ç¨(golangç¼ç¨è¯è¨)
3.linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 。编程编程。源码源码谢谢
4.c++网络编程:Boost.asio源码剖析
5.史上最详细的网络网络网络编程实战教程
Java如何通过网络进行寻找附近的设备,附源码?
在 Java 中,编程编程可以通过使用 Java 的源码源码重庆源码时代真的保就业吗网络编程技术来实现查找附近的设备。具体的网络网络做法如下:获取本机的 IP 地址和子网掩码,以计算出本机所在网络中的编程编程 IP 地址范围。
使用 for 循环和 InetAddress 类扫描网络中的源码源码每一个 IP 地址。
对于每一个 IP 地址,网络网络使用 isReachable() 方法判断其是编程编程否可达,如果可达则表明该 IP 地址对应的源码源码设备存在。
以下是网络网络一份简单的示例代码:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class FindDevices {
public static void main(String[] args) throws UnknownHostException {
InetAddress localHost = InetAddress.getLocalHost();
String hostAddress = localHost.getHostAddress();
String subnet = hostAddress.substring(0, hostAddress.lastIndexOf(".") + 1);
for (int i = 1; i < ; i++) {
String host = subnet + i;
try {
InetAddress address = InetAddress.getByName(host);
if (address.isReachable()) {
System.out.println(host + " is reachable");
}
} catch (Exception e) {
System.out.println(host + " is not reachable");
}
}
}
}
请注意,这是编程编程商业源码获取一份示例代码,其中的源码源码扫描范围和扫描方法可能不是最佳的,根据实际需要进行修改。
golangç½ç»ç¼ç¨(golangç¼ç¨è¯è¨)
Golangç½ç»ç¼ç¨ä¸ç»¸ä¹è·¯-TCP/UDPå°å解æ
TL;DRå¨ä½¿ç¨Golangç¼åTCP/UDPsocketçæ¶åï¼ç¬¬ä¸æ¥åçå°±æ¯å°å解æã
该å½æ°è¿åçå°åå å«çä¿¡æ¯å¦ä¸ï¼
TCPAddréï¼IPæ¢å¯ä»¥æ¯IPv4å°åï¼ä¹å¯ä»¥æ¯IPv6å°åãPortå°±æ¯ç«¯å£äºãZoneæ¯IPv6æ¬å°å°åæå¨çåºåã
ä»è¿åç»æç该å½æ°çåæ°ï¼networkæaddressçç½ç»ç±»åï¼addressæè¦è§£æçå°åï¼ä¼ä»ä¸è§£æåºæ们æ³è¦çIP,PortåZoneã
ä»æºç ä¸å¯ä»¥çåºï¼åæ°networkåªè½æ¯å¦ä¸å个å¼ï¼å¦åä¼å¾å°ä¸ä¸ªé误ã
解æè¿ç¨è·ResolveTCPAddrçä¸æ ·ï¼ä¸è¿å¾å°çæ¯*UDPAddrã
UDPAddrå å«çä¿¡æ¯å¦ä¸ï¼
golangæ¯ä»ä¹ææ
Goè¯è¨(å称Golang)æ¯GoogleçRobertGriesemerï¼RobPikeåKenThompsonå¼åçä¸ç§éæ强类åãç¼è¯åè¯è¨ãGoè¯è¨è¯æ³ä¸Cç¸è¿ï¼ä½åè½ä¸æï¼å åå®å ¨ï¼GC(åå¾åæ¶)ï¼ç»æå½¢æåCSP-style并å计ç®ãæ©å±èµæ
Goè¯è¨ä¸»è¦ç¨ä½æå¡å¨ç«¯å¼åï¼å ¶å®ä½æ¯ç¨æ¥å¼åâ大å软件âçï¼éåäºå¾å¤ç¨åºåä¸èµ·å¼å大å软件ï¼å¹¶ä¸å¼åå¨æé¿ï¼æ¯æäºè®¡ç®çç½ç»æå¡ãGoè¯è¨è½å¤è®©ç¨åºåå¿«éå¼åï¼å¹¶ä¸å¨è½¯ä»¶ä¸æç'å¢é¿è¿ç¨ä¸ï¼å®è½è®©ç¨åºåæ´å®¹æå°è¿è¡ç»´æ¤åä¿®æ¹ãå®èåäºä¼ ç»ç¼è¯åè¯è¨çé«ææ§åèæ¬è¯è¨çæç¨æ§åå¯äºè¡¨è¾¾æ§ã
Goè¯è¨ä½ä¸ºæå¡å¨ç¼ç¨è¯è¨ï¼å¾éåå¤çæ¥å¿ãæ°æ®æå ãèææºå¤çãæ件系ç»ãåå¸å¼ç³»ç»ãæ°æ®åºä»£çç;ç½ç»ç¼ç¨æ¹é¢ï¼Goè¯è¨å¹¿æ³åºç¨äºWebåºç¨ãAPIåºç¨ãä¸è½½åºç¨ç;é¤æ¤ä¹å¤ï¼Goè¯è¨è¿å¯ç¨äºå åæ°æ®åºåäºå¹³å°é¢åï¼ç®åå½å¤å¾å¤äºå¹³å°é½æ¯éç¨Goå¼åã
ä½ä¸ºç¨åºåï¼æ¨èç»åå¦è ç5大ç¼ç¨è¯è¨å ¶å®ï¼åªè¦ä¸æ¯å¤ªå°ä¼ã太边ç¼çç¼ç¨è¯è¨ï¼åªè¦ç²¾éä¸é¨ï¼é½å¯ä»¥æ¨ªè¡ITäºèç½ï¼æ 论就ä¸æåä¸ã
å¨ITç¼ç¨è¿ä¸ªè¡ä¸ï¼åå端åå端ã
å端æå ¥é¨ãæä¸æï¼å¦æä» æ¯ä¸ºäºå°±ä¸èå¦ä¹ ï¼é£ä¹æ¶é´æå ¥äº§åºæ¯ï¼æå¿«çæ¯å¦å端ï¼èä¸æ¯å端ï¼
ä½å¦ä¼äºå端ï¼åå»å¦å端ï¼å°±é常容æï¼å¹¶ä¸å端ä¸ä» å¨å°±ä¸æ¹é¢ï¼èä¸ä»¥åå¼å产åãåä¸é½æ¯å端æä¼å¿ï¼
对äºåãå端è¯è¨ï¼å¦æé½æ¯æ®éçç»ç¨åº¦ï¼ç°é¶æ®µï¼äºè å·¥èµå·®å«ä¸æ¯å¤ªå¤§ï¼ä½ä¸ä¸ªç²¾éå端åä¸ä¸ªç²¾éå端ï¼é½æ¯5年以ä¸çç¨åºåï¼å¾ææ¾ï¼å端ç¨åºåçå·¥èµè¿æ¯å端ç¨åºåå·¥èµé«ã
å 为å¾å¤äººä»äºITç¼ç¨3-5å¹´ï¼é¡¶å¤ä¹å°±ç®çç»ï¼ç§°ä¸ä¸ç²¾éï¼é£ä¹å¯¹äºæ°æï¼è¿çº ç»äºç¼ç¨å¦ä»ä¹è¯è¨å¥½çè¯ï¼æ¨èä¸é¢è¿å ç§è¯è¨æ¥å¦ä¹ ï¼
1ãPHP
å±äºå端è¯è¨ï¼å¦ä¹ å®ç好å¤æ¯ï¼å¦ä¹ æ¶é´çãææ¬ä½ãçææå ¥äº§åºæ¯ææ¾ï¼è½è®©ä½ 对ç¼ç¨ä¸åæææ§æï¼è®©ä½ ç±ä¸ç¼ç¨ï¼å¹¶ä¸å¨å½å é常æµè¡ï¼ç¨æ¥åwebå¼åé常éåï¼è½ååç±»webç³»ç»çå¼åï¼çç»æç²¾éå®ï¼æ 论就ä¸æåä¸ï¼é½å¾easyã缺ç¹æ¯ï¼å ¥é¨å¤ªå®¹æäºï¼å¤ªå¤äººä¼äºï¼åèä¸å¼é±äºï¼æ¾å·¥ä½å®¹æï¼é«èªçè¯ï¼è¦é常精éæè¡ã
2ãjava
ç¸æ¯phpæ¥è¯´ï¼å ¥é¨ç¨å¾®æäºé¾åº¦ï¼ä½çç»æç²¾éåï¼å·¥èµæ®éæ¯phpé«ï¼ä¹å°±æ¯è¯´ä½ æ5å¹´javaå¼åç»éªåæå¹´javaå¼åç»éªï¼æ 论æ¯å·¥èµè¿æ¯ææ¯ï¼æ¯æ天壤ä¹å«çï¼ä½ä½ æ5å¹´phpç»éªåæå¹´phpçç»éªï¼å ¶å®å·®å«ä¸æ¯é常大ãjavaå¯ä»¥åå®åå¼åãæ¡é¢åºç¨ç³»ç»å¼å以åwebå¼åçã
3ãpython
pythonè¯è¨ågolangè¯è¨éå ¶ä¸ä¸ä¸ªæ¥å¦å°±å¯ä»¥ï¼pythonæ¯golangæ´å®¹æäºï¼åºç¨èå´é常广ï¼å¦ï¼webå¼åãç¬è«ã大æ°æ®å¤çãæ¡é¢ç«¯è½¯ä»¶ãè¿å¯ç¨äºæ¸¸æã人工æºè½ãæºå¨äººçãä»å¥½åä»ä¹é½ä¼ï¼ä½ä¸åæä¸é¢åï¼å ¬å¸åèä¼éå ¶ä»è¯è¨ï¼ä»æ¯ä¸ªå¤é¢æï¼ä½å ·ä½é½å¾ç²¾ãå¾ä¸çä¸å¡ï¼åè好å¤å ¬å¸ä¸éä»ï¼è½ç¶å¦æ¤ï¼å¯¹äºä¸ªäººèè¨ï¼å¦ä¹ å®ä¸ä¼éã
4ãgolang
golangä½ä¸ºæå¡å¨ç¼ç¨è¯è¨ï¼å¾éååæ¥å¿å¤çãæ°æ®æå ãèææºå¤çãæ°æ®åºä»£ççå·¥ä½ãå¨ç½ç»ç¼ç¨æ¹é¢ï¼å®è¿å¹¿æ³åºç¨äºwebåºç¨ãAPIåºç¨çé¢åãgolangåå¸äºå¹´ï¼æ¯è¾å¹´è½»ï¼ç®åæå¾å¤æèååä¸åºç¨çéæ±ï¼å·¥èµä¹ä¸éï¼ä½åå¦è ï¼çæå ç¨å®æ¾å·¥ä½æåä¸æé¾åº¦ï¼éåå·²ç»ææ¡äºå ¶ä»è¯è¨çæ åµä¸ï¼å¦ä¹ golangã
5ãC#
éååwindowsç±»æ¡é¢è½¯ä»¶ãåºç¨ç¨åºãwebå¼åï¼BS/CS软件ç¨åºä»é½å¯ä»¥å¼åï¼è½ç¶æ以åå¦è¿asp^^ï¼ä½æ对ä»äºè§£ä¸å¤ï¼ä¸æä¸é¾ï¼ä¹å¯ä»¥å游æå¼åçå端ççã
è¿æè¶ å¤çï¼å¦ï¼Object-CãC++ãCãSwiftãPerl...
对äºå端ï¼åºæ¬ä¸é½æ¯åºäºjavascriptï¼æç®å对å端ä¸æ¯å¾ç²¾éï¼ä½ä¸é¢å 个ä¸ä¸ï¼æ¯é常å¼å¾ä½ å¦ä¹ åææ¡çï¼
1ãvue/uniapp
è¿ä¸¤ä¸ªï¼å¨ç®åï¼å端é常ç«ãå¦è¿ä¸ªå°±ä¸è¦åå»çè¿2个äºï¼reactåangularã
2ãnode.js
è¿ä¸ªæ认为å¯ä»¥è¯´ä»æ¯èæ¬è¯è¨ï¼ä¹å¯ä»¥è¯´ä»æ¯å端è¯è¨ã
3ãH5+CSS+Bootstrap+jquery
è¿ä¸ªé常é常ç容æï¼ä¸è¦ä¸é¨è±æ¶é´å»å¦ï¼å·¥ä½è¿ç¨ä¸ç¨å°ï¼é¡ºä¾¿ççï¼å°±è½ç¨
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
#define SERVPORT
#define BACKLOG
int SendFileToServ(const char *path, const char *FileName, const char *ip)
{
#define PORT
int sockfd;
int recvbytes;
char buf[MAXDATASIZE];
char send_str[MAXDATASIZE];
char filepath[] = { 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[] = { 0};
char FileName[] = { 0};
char path[] = { 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", );
else if(2 == nret)
write(client_fd, "reload nginx error", );
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
#define SERVPORT
#define BACKLOG
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);
}
}
以前写的:内容忘记了。不是很复杂你可以自己看!
c++网络编程:Boost.asio源码剖析
Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是小米图库源码C++标准化进程的开发引擎之一。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。
boost.asio是Boost库中非常著名的I/O组件,是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型。其在性能、移植性、扩展性等方面均为人称道,甚至被很多业内人士称为“网络神器”。asio是目前唯一有希望进入C++标准库以弥补标准库在网络方面的缺失的C++网络库,因此对asio的linux ssh源码学习在某种意义上可以说是学习C++网络编程的必修课。
本文从源码角度出发,深入浅出地剖析asio的架构和设计理念,将asio的一切秘密呈现在读者眼前。适合已有较完善的C++基础知识、具备一定程度的泛型技术和面向对象技术、并对boost.asio有一定的了解的读者。
asio的核心架构由三大组件构成:io_object、services服务和"Asio核心组件",其中io_object是I/O对象的集合,包含socket、deadline_timer等对象;services服务是逻辑功能的实现者,包含deadline_timer_service、win_iocp_socket_service等服务;"Asio核心组件"即io_service,多看小说源码通过关联类service_registry管理服务,由io_object提供接口。
io_service的真正逻辑实现封装在内部桥接的类io_service_impl中,io_service_impl继承于service_base,在io_service初始化时被创建并由io_service持有其引用。asio中包含多个服务,如strand_service、deadline_timer_service、stream_socket_service等,以及对应的I/O对象如io_service::strand、basic_deadline_timer等。
asio中还包含Protocol和InternetProtocol概念,用于定义通信协议和网络通信协议。此外,还引入了泛型概念如ConstBuffer、ConstBufferSequence、MutableBuffer、MutableBufferSequence、Stream、AsyncReadStream、AsyncWriteStream、SyncReadStream和SyncWriteStream等,使得asio在设计上更加灵活和高效。
泛型与面向对象的完美结合使得asio在设计上既具有面向对象的封装性和可扩展性,又具备泛型编程的灵活性和高效性。通过Service Concept和CSU(Core-Service-User)架构,asio实现了用户友好的接口设计,使得开发者能够以简单而统一的方式使用asio提供的功能,无需自行处理复杂的泛型组件组装工作。
史上最详细的网络编程实战教程
本文通过介绍libhv——一个比libevent、libev、libuv更易用的跨平台国产网络库,旨在提供网络编程实战教程,帮助读者更好地理解TCP/UDP/SSL/HTTP/WebSocket网络编程。libhv提供了带非阻塞IO和定时器的事件循环,适用于开发TCP/UDP/SSL/HTTP/WebSocket客户端/服务端。
项目地址:github.com/ithewei/libhv
码云镜像:gitee.com/libhv/libhv.gitee.com
QQ技术交流群:
libhv博客专栏:hewei.blog.csdn.net/cat
libhv源码分析:blog.csdn.net/qu/ca
libhv教程--目录
libhv是一个跨平台网络库,适用于开发TCP/UDP/SSL/HTTP/WebSocket客户端/服务端。
libhv教程--介绍与体验
libhv是一个高性能事件循环库,寓意High-performance event loop library(高性能事件循环库)。Linux与mac用户可直接执行getting_started.sh脚本体验libhv编写的作为客户端测试。
libhv教程--创建一个简单的TCP客户端
完整TCP/UDP客户端程序参考examples/nc.c,c++版本示例代码见evpp目录下的TcpClient_test.cpp。
libhv教程--创建一个简单的UDP服务端
以UDP echo server为例,使用libhv创建UDP服务端。编译运行后,可使用nc作为客户端测试。
libhv教程--创建一个简单的UDP客户端
完整TCP/UDP客户端程序参考examples/nc.c,c++版本示例代码见evpp目录下的UdpClient_test.cpp。
libhv教程--创建一个简单的HTTP服务端
以HTTP协议为例,使用libhv创建HTTP服务端。c版本示例代码参考examples/http_server_test.cpp,c++版本示例代码参考evpp目录下的HttpServer_test.cpp。
libhv教程--创建一个简单的HTTP客户端
完整HTTP客户端示例代码参考examples/curl.cpp,模拟实现了curl命令行程序。
libhv教程--创建一个简单的WebSocket服务端
以WebSocket协议为例,使用libhv创建WebSocket服务端。示例代码参考examples/websocket_server_test.cpp。
libhv教程--创建一个简单的WebSocket客户端
WebSocket客户端示例代码参考examples/websocket_client_test.cpp。
libhv教程--实现一个纯C版jsonrpc框架
使用libhv实现一个行内的jsonrpc框架,借助libhv提供的接口hio_set_unpack设置拆包规则,大大节省了处理粘包与分包的成本。
libhv教程--实现一个C++版protorpc框架
实现一个行内的C++版protorpc框架,使用evpp模块+protobuf实现。
创作不易,如果你觉得不错,请在github上star下吧。