使用C語言編寫基于TCP協(xié)議的Socket通訊程序?qū)嵗窒?/h1>
來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次
tcp客戶端示例
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
typedef struct _NSS_HEADER
{
unsigned short ProtocolVersion; /* 協(xié)議版本信息 */
unsigned short MsgType; /* 消息類型 */
unsigned short TransactionNo; /* 傳輸編號(hào) */
unsigned short PacketLength; /* 數(shù)據(jù)包長度,包括Header */
}NSS_HEADER;
int str_echo(int sockfd, unsigned short no)
{
ssize_t readLen;
ssize_t writeLen;
char buf[8];
NSS_HEADER *hdr = (NSS_HEADER*)buf;
memset( hdr, 0, sizeof(NSS_HEADER) );
hdr->TransactionNo = no;
// 寫數(shù)據(jù)
int nWriteLen = 0;
while ( true )
{
writeLen = write(sockfd, &buf[nWriteLen], sizeof(NSS_HEADER)-nWriteLen);
// printf( "write %d/n", writeLen);
if (writeLen < 0 && errno == EINTR)
{
continue;
}
else if ( writeLen < 0 )
{
perror ( "write:" );
return -1;
}
nWriteLen += writeLen;
// 已寫完,直接返回
if (nWriteLen >= sizeof(NSS_HEADER) )
{
break;
}
}
printf( "send data successed. trans no: %d/n", no );
// 讀數(shù)據(jù)
int nReadLen = 8;
while ( true )
{
readLen = read(sockfd, buf, nReadLen);
// printf( "read: %d/n", readLen );
if (readLen < 0 && errno == EINTR)
{
continue;
}
else if ( readLen <= 0 )
{
perror( "read:");
return -1;
}
else
{
nReadLen -= readLen;
if (nReadLen <= 0 )
{
break;
}
}
}
printf( "read response successed./n" );
return 0;
}
int main(int argc, char **argv)
{
printf("client ip: %s/n", argv[1]);
printf("client port: %s/n", argv[2]);
printf("server ip: %s/n", argv[3]);
printf("server port: %s/n", argv[4]);
printf("/n service starting.../n/n");
while( true )
{
int socketFd;
struct sockaddr_in svrAddr;
struct sockaddr_in localAddr;
socketFd = socket (AF_INET, SOCK_STREAM, 0);
if ( -1 == socketFd )
{
perror( "socket:" );
continue;
}
// 設(shè)置地址可復(fù)用
int option = 1;
setsockopt( socketFd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) );
// 客戶端IP
memset(&localAddr, 0, sizeof(localAddr));
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = inet_addr( argv[1]);
localAddr.sin_port = htons (atoi(argv[2]));
int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr));
if ( -1 == bindResult )
{
perror( "bind:" );
sleep(10);
close(socketFd);
continue;
}
// 服務(wù)器IP
memset(&svrAddr, 0, sizeof(svrAddr));
svrAddr.sin_family = AF_INET;
svrAddr.sin_addr.s_addr = inet_addr( argv[3]);
svrAddr.sin_port = htons (atoi(argv[4]));
// 不斷重連
int connResult = connect(socketFd, (struct sockaddr *) &svrAddr, sizeof(svrAddr));
if ( -1 == connResult )
{
perror( "connect:" );
sleep(10);
close(socketFd);
continue;
}
printf (" connect %s:%s successed./n", argv[3], argv[4] );
static unsigned short no = 0;
// 連接成功,每分鐘發(fā)送一次數(shù)據(jù)
for ( ; ; )
{
if ( -1 == str_echo(socketFd, no++) )
{
break;
}
sleep( 60 );
}
close(socketFd);
}
}
tcp服務(wù)器源碼示例
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
struct _NSS_HEADER
{
unsigned short ProtocolVersion; /* 協(xié)議版本信息 */
unsigned short MsgType; /* 消息類型 */
unsigned short TransactionNo; /* 傳輸編號(hào) */
unsigned short PacketLength; /* 數(shù)據(jù)包長度,包括Header */
}NSS_HEADER;
void str_echo(int sockfd)
{
ssize_t readLen;
ssize_t writeLen;
char buf[8];
while ( true )
{
readLen = read(sockfd, buf, 8);
if (readLen < 0 && errno == EINTR)
{
continue;
}
else if ( readLen <= 0 )
{
perror( "read:");
return ;
}
printf( "recv data successed. data len: %d/n", readLen );
int nWriteLen = 0;
while ( true )
{
writeLen == write(sockfd, &buf[nWriteLen], readLen-nWriteLen);
if (writeLen < 0 && errno == EINTR)
{
continue;
}
else if ( writeLen < 0 )
{
perror ( "write:" );
return;
}
nWriteLen += writeLen;
// 已寫完,直接返回
if (nWriteLen >= readLen )
{
break;
}
}
printf( "send data successed. data len: %d/n", readLen );
}
}
int main(int argc, char **argv)
{
printf( "server ip: %s/n", argv[1] );
printf( "server port: %s/n", argv[2] );
printf( "/nservice starting ... /n/n" );
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = socket (AF_INET, SOCK_STREAM, 0);
if ( -1 == listenfd )
{
perror( "socket:" );
exit(-1);
}
// 設(shè)置地址可復(fù)用
int option = 1;
setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) );
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr( argv[1]);
servaddr.sin_port = htons (atoi(argv[2]));
int bindResult = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if ( -1 == bindResult )
{
perror( "bind:" );
exit(-1);
}
int listenResult = listen(listenfd, 5);
if ( -1 == listenResult )
{
perror( "listen:" );
exit(-1);
}
for ( ; ; )
{
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);
if ( -1 == connfd )
{
perror( "accept:" );
continue;
}
printf ("accept %s successed.fd: %d/n", inet_ntoa(cliaddr.sin_addr), connfd );
if ( (childpid = fork()) == 0)
{ /* child process */
close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
printf ("disconnect from %d ./n", connfd );
exit (0);
}
}
close(connfd); /* parent closes connected socket */
}
tcp客戶端示例
#include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> typedef struct _NSS_HEADER { unsigned short ProtocolVersion; /* 協(xié)議版本信息 */ unsigned short MsgType; /* 消息類型 */ unsigned short TransactionNo; /* 傳輸編號(hào) */ unsigned short PacketLength; /* 數(shù)據(jù)包長度,包括Header */ }NSS_HEADER; int str_echo(int sockfd, unsigned short no) { ssize_t readLen; ssize_t writeLen; char buf[8]; NSS_HEADER *hdr = (NSS_HEADER*)buf; memset( hdr, 0, sizeof(NSS_HEADER) ); hdr->TransactionNo = no; // 寫數(shù)據(jù) int nWriteLen = 0; while ( true ) { writeLen = write(sockfd, &buf[nWriteLen], sizeof(NSS_HEADER)-nWriteLen); // printf( "write %d/n", writeLen); if (writeLen < 0 && errno == EINTR) { continue; } else if ( writeLen < 0 ) { perror ( "write:" ); return -1; } nWriteLen += writeLen; // 已寫完,直接返回 if (nWriteLen >= sizeof(NSS_HEADER) ) { break; } } printf( "send data successed. trans no: %d/n", no ); // 讀數(shù)據(jù) int nReadLen = 8; while ( true ) { readLen = read(sockfd, buf, nReadLen); // printf( "read: %d/n", readLen ); if (readLen < 0 && errno == EINTR) { continue; } else if ( readLen <= 0 ) { perror( "read:"); return -1; } else { nReadLen -= readLen; if (nReadLen <= 0 ) { break; } } } printf( "read response successed./n" ); return 0; } int main(int argc, char **argv) { printf("client ip: %s/n", argv[1]); printf("client port: %s/n", argv[2]); printf("server ip: %s/n", argv[3]); printf("server port: %s/n", argv[4]); printf("/n service starting.../n/n"); while( true ) { int socketFd; struct sockaddr_in svrAddr; struct sockaddr_in localAddr; socketFd = socket (AF_INET, SOCK_STREAM, 0); if ( -1 == socketFd ) { perror( "socket:" ); continue; } // 設(shè)置地址可復(fù)用 int option = 1; setsockopt( socketFd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) ); // 客戶端IP memset(&localAddr, 0, sizeof(localAddr)); localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = inet_addr( argv[1]); localAddr.sin_port = htons (atoi(argv[2])); int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr)); if ( -1 == bindResult ) { perror( "bind:" ); sleep(10); close(socketFd); continue; } // 服務(wù)器IP memset(&svrAddr, 0, sizeof(svrAddr)); svrAddr.sin_family = AF_INET; svrAddr.sin_addr.s_addr = inet_addr( argv[3]); svrAddr.sin_port = htons (atoi(argv[4])); // 不斷重連 int connResult = connect(socketFd, (struct sockaddr *) &svrAddr, sizeof(svrAddr)); if ( -1 == connResult ) { perror( "connect:" ); sleep(10); close(socketFd); continue; } printf (" connect %s:%s successed./n", argv[3], argv[4] ); static unsigned short no = 0; // 連接成功,每分鐘發(fā)送一次數(shù)據(jù) for ( ; ; ) { if ( -1 == str_echo(socketFd, no++) ) { break; } sleep( 60 ); } close(socketFd); } }
tcp服務(wù)器源碼示例
#include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> struct _NSS_HEADER { unsigned short ProtocolVersion; /* 協(xié)議版本信息 */ unsigned short MsgType; /* 消息類型 */ unsigned short TransactionNo; /* 傳輸編號(hào) */ unsigned short PacketLength; /* 數(shù)據(jù)包長度,包括Header */ }NSS_HEADER; void str_echo(int sockfd) { ssize_t readLen; ssize_t writeLen; char buf[8]; while ( true ) { readLen = read(sockfd, buf, 8); if (readLen < 0 && errno == EINTR) { continue; } else if ( readLen <= 0 ) { perror( "read:"); return ; } printf( "recv data successed. data len: %d/n", readLen ); int nWriteLen = 0; while ( true ) { writeLen == write(sockfd, &buf[nWriteLen], readLen-nWriteLen); if (writeLen < 0 && errno == EINTR) { continue; } else if ( writeLen < 0 ) { perror ( "write:" ); return; } nWriteLen += writeLen; // 已寫完,直接返回 if (nWriteLen >= readLen ) { break; } } printf( "send data successed. data len: %d/n", readLen ); } } int main(int argc, char **argv) { printf( "server ip: %s/n", argv[1] ); printf( "server port: %s/n", argv[2] ); printf( "/nservice starting ... /n/n" ); int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = socket (AF_INET, SOCK_STREAM, 0); if ( -1 == listenfd ) { perror( "socket:" ); exit(-1); } // 設(shè)置地址可復(fù)用 int option = 1; setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) ); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr( argv[1]); servaddr.sin_port = htons (atoi(argv[2])); int bindResult = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); if ( -1 == bindResult ) { perror( "bind:" ); exit(-1); } int listenResult = listen(listenfd, 5); if ( -1 == listenResult ) { perror( "listen:" ); exit(-1); } for ( ; ; ) { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); if ( -1 == connfd ) { perror( "accept:" ); continue; } printf ("accept %s successed.fd: %d/n", inet_ntoa(cliaddr.sin_addr), connfd ); if ( (childpid = fork()) == 0) { /* child process */ close(listenfd); /* close listening socket */ str_echo(connfd); /* process the request */ printf ("disconnect from %d ./n", connfd ); exit (0); } } close(connfd); /* parent closes connected socket */ }
上一篇:詳解設(shè)計(jì)模式中的中介者模式在C++編程中的運(yùn)用
欄 目:C語言
下一篇:一些C語言中字符串的算法問題解決實(shí)例小結(jié)
本文標(biāo)題:使用C語言編寫基于TCP協(xié)議的Socket通訊程序?qū)嵗窒?/a>
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2410.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改