一、需求
有時我們的程式在產品上跑,不知道那天會出現問題,再重啟程式才能看到列印的訊息,但是重啟後問題又不出現了,所以就需要在出問題的時候能看到程式的列印訊息。
二、程式設計
用tcp來傳送列印訊息,服務端只需要呼叫int creasendpthread(),而客戶端只需要呼叫int crearecvpthread(char *ipaddr)就可以了,埠已經預設繫結一樣了。在工程裡面在需要列印的地方先#inlcude 頭,用ro_printf進行列印就可以了。
/*debugcom.h*/
#ifndef _debugcom_h_
#define _debugcom_h_
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxnum 10
#define ro_printf(format, ...) do \
else\
\}while(0)
#define packsize (40*50)
#define permsgsize 40
#define port 8186
int cpsize;
char recvbuf[packsize];
char sendbuf[packsize];
char cache[permsgsize];
int create_socket();
int sock_bind(int lisfd, int port);
int sock_listen(int lisfd, int max_con);
int sock_accept(int lisfd);
int sock_connect(int clifd, char *ipaddr, int port);
int sock_send(int sockfd, void *buf, size_t len, int flags);
int sock_recv(int sockfd, void *buf, size_t len, int flags);
void *debugsendmain(void *arg);
void *debugrecvmain(void *arg);
int creasendpthread();
int crearecvpthread(char *ipaddr);
#endif
/*debugcom.c*/
#include "debugcom.h"
int create_socket()
return lisfd;
}int sock_bind(int lisfd, int port)
return 0;
}int sock_listen(int lisfd, int max_con)
return 0;
}int sock_accept(int lisfd)
printf("clifd: %d\n", clifd);
printf("connected from %s, port: %d\n", inet_ntoa(remoaddr.sin_addr), ntohs(remoaddr.sin_port));
return clifd;
}int sock_connect(int clifd, char *ipaddr, int port)
return 0;
}int sock_send(int sockfd, void *buf, size_t len, int flags)
return nbytes;
}int sock_recv(int sockfd, void *buf, size_t len, int flags)
return nbytes;
}void *debugsendmain(void *arg)
if (i > maxi)
if (--nready <= 0)
}for (i=0; i<= maxi; i++)//檢測所有客戶端的資料
if (fd_isset(sockfd, &rset))
else
if (--nready <= 0)}}
}}void *debugrecvmain(void *arg)
}int main(int argc, char **argv)
creasendpthread();
pause();
return 0;
}
/*client.c*/
#include "debugcom.h"
int main(int argc, char **argv)
#makefile
cflags = -wall -g
cc = gcc
target1 = server
target2 = client
libs = -pthread
all:$(target1) $(target2)
$(target1):$(target1).o debugcom.o
$(cc) $(cflags) $(libs) -o $@ $^
$(target2):$(target2).o debugcom.o
$(cc) $(cflags) $(libs) -o $@ $^
%.o:%.c %.h
$(cc) -c $(cflags) $(libs) -o $@ $<
clean:
rm -f $(target1) $(target2) *.o
以下是window下的客戶端版本:
/*client.c*/#include #include #include #include #include #include using namespace std;
#define packsize (40*50)
#define permsgsize 40
char recvbuf[packsize];
char sendbuf[packsize];
char cache[permsgsize];
int main()
printf("init ...\n");
// 載入socket動態鏈結庫(dll)
word wversionrequested;
wsadata wsadata; // 這結構是用於接收wjndows socket的結構資訊的
wversionrequested = makeword(1, 1); // 請求1.1版本的winsock庫
err = wsastartup( wversionrequested, &wsadata );
if ( err != 0 )
if ( lobyte( wsadata.wversion ) != 1 || hibyte( wsadata.wversion ) != 1 )
// 建立socket操作,建立流式套接字,返回套接字型大小sockclient
// socket socket(int af, int type, int protocol);
// 第乙個引數,指定位址簇(tcp/ip只能是af_inet,也可寫成pf_inet)
socket sockclient = socket(af_inet, sock_stream, 0);
// 將套接字sockclient與遠端主機相連
// int connect( socket s, const struct sockaddr* name, int namelen);
// 第乙個引數:需要進行連線操作的套接字
// 第三個引數:位址的長度
sockaddr_in addrsrv;
addrsrv.sin_addr.s_un.s_addr = inet_addr(ip); // 本地迴路位址是127.0.0.1;
addrsrv.sin_family = af_inet;
addrsrv.sin_port = htons(8186);
connect(sockclient, (sockaddr*)&addrsrv, sizeof(sockaddr));
memset(recvbuf, 0, packsize);
memset(sendbuf, 0, packsize);
memset(cache, 0, permsgsize);
memset(ptime, 0, 25);
strcpy(sendbuf, "hello");
while(1)
{ //sleep(4*1000);
send(sockclient, sendbuf, sizeof(sendbuf), 0);
recv(sockclient, recvbuf, sizeof(recvbuf), 0);
for (i=0; i
Linux下的TCP通訊
linux下的tcp通訊 今天我們介紹如何編寫linux下的tcp程式,關於udp程式我還沒學。伺服器端的步驟如下 1.socket 建立乙個socket 2.bind 將這個socket繫結在某個檔案上 af unix 或某個埠上 af inet 我們會分別介紹這兩種。3.listen 開始監聽 ...
linux下列印呼叫棧
include include include include stacktrace.h 列印呼叫棧的最大深度 define dump stack depth max 16 列印呼叫棧函式 void dump trace char stack strings null int stack depth...
linux下的TCP小程式
服務端是用多執行緒寫的併發伺服器,比較簡單。功能 1 服務端執行後,即監聽指定的埠。允許多個連線併發執行 2 服務端接收到客戶端請求後,根據客戶端傳過來的指令完成特定任務 a 向客戶端傳送服務端所在機器的當前時間 b 向客戶端傳送服務端所在機器的名稱 c 向客戶端傳送當前連線的所有客戶端資訊 d 其...