Linux下TCP輸出列印訊息

2021-06-28 02:49:02 字數 4608 閱讀 8356

一、需求

有時我們的程式在產品上跑,不知道那天會出現問題,再重啟程式才能看到列印的訊息,但是重啟後問題又不出現了,所以就需要在出問題的時候能看到程式的列印訊息。

二、程式設計

用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 其...