首页 > 代码库 > 向本地主机发送daytime请求

向本地主机发送daytime请求

 1 #pragma once
 2 #include<stdlib.h>
 3 #include<stdio.h>
 4 #include<string.h>
 5 #include<winsock.h>
 6 
 7 void errexit(const char*, ...);
 8 
 9 #ifndef INADDR_NONE
10 #define INADDR_NONE 0xfffffff
11 #endif 
12 
13 
14 SOCKET connectsock(const char *host, const char *service, 
15                    const char *transport) {
16     struct hostent *phe;
17     struct servent *pse;
18     struct protoent *ppe;
19     struct sockaddr_in sin;
20     int s, type;
21 
22     memset(&sin, 0, sizeof(sin));
23     sin.sin_family = AF_INET;
24     if (pse = getservbyname(service, transport))
25         sin.sin_port = pse->s_port;
26     else if ((sin.sin_port = htons((u_short)atoi(service))) == 0)
27         errexit("can‘t get\"%s\"service entry\n", service);
28     if (phe = gethostbyname(host))
29         memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
30     else if ((sin.sin_port = inet_addr(host)) == INADDR_NONE)
31         errexit("can‘t get\"%s\"host entry\n", host);
32     if((ppe = getprotobyname(transport)) == 0)
33         errexit("can‘t get\"%s\"protocol entry\n", transport);
34 
35     if (strcmp(transport, "udp") == 0)
36         type = SOCK_DGRAM;
37     else
38         type = SOCK_STREAM;
39 
40     s = socket(PF_INET, type, ppe->p_proto);
41     if(s == INVALID_SOCKET)
42         errexit("can‘t create socket:%d\n",GetLastError());
43     
44     if(connect(s,(struct sockaddr *)&sin,sizeof(sin)) == SOCKET_ERROR)
45         errexit("can‘t connect\n", GetLastError());
46     return s;
47 }
48 
49 
50 
51 
52 void errexit(const char *format, ...) {
53     va_list args;
54     va_start(args, format);
55     vfprintf(stderr, format, args);
56     va_end(args);
57     WSACleanup();
58     exit(1);
59 }

 

 

 

 1 #include<stdlib.h>
 2 #include<stdio.h>
 3 #include<winsock.h>
 4 #include"conect.h"
 5 
 6 void tcpdaytime(const char*, const char *);
 7 void errexit(const char*, ...);
 8 SOCKET connecttcp(const char*, const char *);
 9 
10 #define LINELEN 128
11 #define WSVERS MAKEWORD(2,0)
12 
13 
14 int main(int argc, char *argv[]) {
15     char *host = "localhost";
16     char *service = "daytime";
17     WSADATA wsadata;
18     switch (argc) {
19     case 1:
20         host = "localhost";
21         break;
22     case 3:
23         service = argv[1];//没有break
24     case 2:
25         host = argv[1];
26         break;
27     default:
28         fprintf(stderr, "usage:tcpdaytime[host[port]]\n");
29         exit(1);
30     }
31     if (WSAStartup(WSVERS, &wsadata) != 0)
32         errexit("wsastartup error\n");
33     tcpdaytime(host, service);
34     WSACleanup();
35     return 0;
36 }
37 
38 
39 void tcpdaytime(const char *host, const char *service) {
40     char buf[LINELEN + 1];
41     SOCKET s;
42     int cc;
43     s = connecttcp(host, service);
44     cc = recv(s, buf, LINELEN, 0);
45     while (cc != SOCKET_ERROR && cc > 0) {
46         buf[cc] = \0;
47         (void)fputs(buf, stdout);
48         cc = recv(s, buf, LINELEN, 0);
49     }
50     closesocket(s);
51 }
52 
53 SOCKET connecttcp(const char*host, const char *service) {
54     return connectsock(host, service, "tcp");
55 }

 

向本地主机发送daytime请求