/* TCPtecho.cpp - main, TCPtecho, reader, writer, mstime */
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <winsock.h>
#include<iostream.h>
//#include<sys/TYPES.H>
#define BUFSIZE 4096 /* write buffer size */
#define CCOUNT 64*1024 /* default character count */
#define WSVERS MAKEWORD(2, 0)
#define MIN(x, y) ((x)>(y) ? (y) : (x))
#define USAGE "usage: TCPtecho [ -c count ] host1 host2...\n"
struct hdat {
char *hd_name; /* host name */
SOCKET hd_sock; /* host socket descriptor */
unsigned hd_rc; /* recv character count */
unsigned hd_wc; /* send character count */
} hdat[FD_SETSIZE]; /* fd to host name mapping */
char buf[BUFSIZE]; /* read/write data buffer */
void TCPtecho(fd_set *, int);
int reader(struct hdat *, fd_set *);
void writer(struct hdat *, fd_set *);
void errexit(const char *, ...);
SOCKET connectTCP(const char *, const char *);
long mstime(u_long *);
int connectsock(const char *host, const char *service, const char *transport);
/*------------------------------------------------------------------------
* main - concurrent TCP client for ECHO service timing
*------------------------------------------------------------------------
*/
void
main(int argc, char *argv[])
{
int ccount = CCOUNT;
int i, hcount, fd;
unsigned long one = 1;
fd_set afds;
WSADATA wsdata;
hcount = 0;
if (WSAStartup(WSVERS, &wsdata))
errexit("WSAStartup failed\n");
FD_ZERO(&afds);
for (i=1; i<argc; ++i) {
if (strcmp(argv[i], "-c") == 0) {
if (++i < argc && (ccount = atoi(argv[i])))
continue;
errexit(USAGE);
}
/* else, a host */
fd = connectTCP(argv[i], "echo");
if (ioctlsocket(fd, FIONBIO, &one)) {
fprintf(stderr,
"can't mark nonblocking (host %s): %d\n",
argv[i], GetLastError());
continue;
}
hdat[hcount].hd_name = argv[i];
hdat[hcount].hd_sock = fd;
hdat[hcount].hd_rc = hdat[hcount].hd_wc = ccount;
++hcount;
FD_SET(fd, &afds);
}
TCPtecho(&afds, hcount);
WSACleanup();
exit(0);
}
/*------------------------------------------------------------------------
* TCPtecho - time TCP ECHO requests to multiple servers
*------------------------------------------------------------------------
*/
void
TCPtecho(fd_set *pafds, int hcount)
{
fd_set rfds, wfds; /* read/write fd sets */
fd_set rcfds, wcfds; /* read/write fd sets (copy) */
int fd, hndx, i;
for (i=0; i<BUFSIZE; ++i) /* echo data */
buf[i] = 'D';
memcpy(&rcfds, pafds, sizeof(rcfds));
memcpy(&wcfds, pafds, sizeof(wcfds));
(void) mstime((u_long *)0); /* set the epoch */
while (hcount) {
memcpy(&rfds, &rcfds, sizeof(rfds));
memcpy(&wfds, &wcfds, sizeof(wfds));
if (select(FD_SETSIZE, &rfds, &wfds, (fd_set *)0,
(struct timeval *)0) == SOCKET_ERROR)
errexit("select failed: error %d\n",
GetLastError());
for (hndx=0; hndx<hcount; ++hndx) {
fd = hdat[hndx].hd_sock;
if (FD_ISSET(fd, &rfds))
if (reader(&hdat[hndx], &rcfds) == 0) {
/* this host is done */
for (i=hndx+1; i<hcount; ++i)
hdat[i-1]=hdat[i];
hcount--;
continue;
}
if (FD_ISSET(fd, &wfds))
writer(&hdat[hndx], &wcfds);
}
}
}
/*------------------------------------------------------------------------
* reader - handle ECHO reads
*------------------------------------------------------------------------
*/
int
reader(struct hdat *phd, fd_set *pfdset)
{
u_long now;
int cc;
cc = recv(phd->hd_sock, buf, sizeof(buf), 0);
if (cc == SOCKET_ERROR)
errexit("recv: error %d\n", GetLastError());
if (cc == 0)
errexit("recv: premature end of file\n");
phd->hd_rc -= cc;
if (phd->hd_rc > 0)
return 1;
(void) mstime(&now);
printf("%s: %d ms\n", phd->hd_name, now);
(void) closesocket(phd->hd_sock);
FD_CLR(phd->hd_sock, pfdset);
return 0;
}
/*------------------------------------------------------------------------
* writer - handle ECHO writes
*------------------------------------------------------------------------
*/
void
writer(struct hdat *phd, fd_set *pfdset)
{
int cc;
cc = send(phd->hd_sock, buf, MIN(sizeof(buf), phd->hd_wc), 0);
if (cc == SOCKET_ERROR)
errexit("send: error number %d\n", GetLastError());
phd->hd_wc -= cc;
if (phd->hd_wc == 0) {
(void) shutdown(phd->hd_sock, 1);
FD_CLR(phd->hd_sock, pfdset);
}
}
/*------------------------------------------------------------------------
* mstime - report the number of clock ticks elapsed since mstime(0) call
*------------------------------------------------------------------------
*/
long
mstime(u_long *pms)
{
static unsigned long epoch;
unsigned long now;
now = clock();
if (pms == 0) {
epoch = now;
return 0;
}
*pms = now - epoch;
return *pms;
}
SOCKET connectTCP( const char *host, const char *service)
{
return connectsock( host, service, "tcp");
}
void errexit(const char *, ...)
{
cout<<"ss";
}
int connectsock(const char *host, const char *service, const char *transport)
{
struct hostent *phe;
struct servent *pse;
struct protoent *ppe;
struct sockaddr_in sin;
int s, type;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
if( pse = getservbyname(service, transport))
sin.sin_port = pse->s_port;
else if ((sin.sin_port = htons((unsigned short)atoi(service))) == 0)
errexit("can't get service entry\n");
if (phe = gethostbyname(host))
memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
else if ( (sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)
errexit("can't get host entry\n");
if ((ppe = getprotobyname(transport)) == 0)
errexit("can't get protocol entry\n");
if (strcmp(transport, "udp") == 0)
type = SOCK_DGRAM;
else
type = SOCK_STREAM;
s = socket(PF_INET, type, ppe->p_proto);
if (s < 0)
errexit("can't create socket\n");
if (connect (s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
errexit("can't connect\n'");
return s;
}
没有合适的资源?快使用搜索试试~ 我知道了~
tcp_examples.rar_tcp ip 程序_tcp演示_进行网际互联
共97个文件
cpp:43个
ncb:11个
dsp:11个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 19 浏览量
2022-09-14
15:03:53
上传
评论
收藏 174KB RAR 举报
温馨提示
tcp_ip进行网际互联演示程序,分别归类并调试,可以直接编译运行,有助于理解Tcp/ip协议原理。
资源推荐
资源详情
资源评论
收起资源包目录
tcp_examples.rar (97个子文件)
www.pudn.com.txt 218B
examples
TCPEcho
TCPEcho.ncb 49KB
consock.cpp 2KB
TCPEcho.plg 1KB
conTCP.cpp 454B
TCPEcho.dsp 4KB
TCPEcho.opt 49KB
errexit.cpp 478B
TCPecho.cpp 2KB
TCPEcho.dsw 539B
superd.cpp 3KB
consock.cpp 2KB
conTCP.cpp 454B
passUDP.cpp 409B
passTCP.cpp 429B
UDPEcho
consock.cpp 2KB
UDPEcho.opt 50KB
errexit.cpp 478B
UDPEcho.dsp 4KB
UDPEcho.plg 961B
conUDP.cpp 453B
UDPEcho.ncb 49KB
UDPecho.cpp 2KB
UDPEcho.dsw 539B
OOBServer
OOBServer.dsp 4KB
OOBServer.dsw 543B
OOBServer.ncb 33KB
OOBServer.plg 895B
OOBServer.cpp 5KB
OOBServer.opt 49KB
TCPecho.plg 1KB
TCPechod.cpp 2KB
TCPdtc.cpp 2KB
TCPecho.ncb 25KB
UCPEcho_Ser
consock.cpp 2KB
UCPEcho_Ser.dsp 4KB
passUDP.cpp 416B
UCPEcho_Ser.opt 50KB
UCPEcho_Ser.plg 1KB
UDPEchoS.cpp 2KB
errexit.cpp 478B
UCPEcho_Ser.dsw 547B
UCPEcho_Ser.ncb 57KB
conUDP.cpp 452B
UDPtimed.cpp 1KB
TCPEcho_server
TCPEcho_server.dsw 553B
passTCP.cpp 429B
TCPEcho_server.opt 50KB
TCPechod.cpp 2KB
TCPEcho_server.ncb 49KB
passsock.cpp 2KB
errexit.cpp 478B
TCPEcho_server.dsp 5KB
TCPEcho_server.plg 1KB
passsock.cpp 2KB
errexit.cpp 478B
UDPtime.cpp 2KB
TCPecho.cpp 2KB
OOB_Clent
OOB_Clent.cpp 2KB
OOB_Clent.dsw 543B
OOB_Clent.opt 49KB
OOB_Clent.ncb 33KB
OOB_Clent.dsp 4KB
OOB_Clent.plg 895B
templated
templated.ncb 33KB
templated.dsw 543B
templated.opt 48KB
templated.dsp 4KB
template.cpp 277B
templated.plg 1KB
TCPmechd.cpp 2KB
tcp_ip
tcp_ip.dsw 538B
tcp_ip.dsp 115B
tcp_ip.opt 37KB
tcp_ip.ncb 33KB
TCPtecho.ncb 49KB
TCP daytime_Server
TCP daytime_Server.opt 48KB
passTCP.cpp 429B
TCP daytime_Server.dsw 561B
passsock.cpp 2KB
errexit.cpp 478B
TCP daytime_Server.plg 270B
TCPdtd.cpp 2KB
TCP daytime_Server.dsp 5KB
TCP daytime_Server.ncb 49KB
TCPtecho.plg 785B
TCPtecho.dsw 541B
conUDP.cpp 446B
TCPdtd.cpp 2KB
TCPtecho.cpp 6KB
ws2_32.dll 81KB
sv_funcs.cpp 2KB
UDPecho.cpp 2KB
TCPtecho.opt 163KB
TCPtecho.dsp 3KB
TCPecho.dsp 3KB
daytimed.cpp 2KB
共 97 条
- 1
资源评论
我虽横行却不霸道
- 粉丝: 73
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功