客户端代码
//#include "unp.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h> // bzero()头文件
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#define MAXLINE 4096
#define SA struct sockaddr
int main(int argc, char **argv)
{
int sockfd;
int n;
char recvline[MAXLINE+1];
int ret;
struct sockaddr_in seraddr;
if(argc != 2)
{
printf("usage: a.out <IPaddress>");
//exit(0);
return 0;
}
/*
socket()创建一个网际(AF_INEF)字节流(SOCK_STREAM)套接字。TCP套接字
该函数返回一个小整数描述符,后面的函数调用(如connect/read)就用该描述符来标识这个套接字
*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
//err_sys("socket error");
printf( "socket error");
return 0;
}
/*指定服务器的IP地址和端口*/
bzero(&seraddr, sizeof(seraddr)); /*使用bzero()将结构体清空*/
seraddr.sin_family = AF_INET;/*地址族*/
seraddr.sin_port = htons(13000);/*端口号*/ /*daytime server*//*htons()将主机字节序转换为网络字节序*/
if(inet_pton(AF_INET, argv[1], &seraddr.sin_addr) <= 0)//inet_pton()将点分十进制转换为二进制整数
{
//err_quit("inet_pton error for %s ",argv[1]);
printf("inet_pton error for");
return 0;
}
//seraddr.sin_addr.s_addr = inet_addr(argv[1]);
/*建立与服务器的连接*/
/*connect()应用于一个TCP套接字时,将于由它第二个参数指向的套接字地址结构指定的服务器建立一个TCP连接*/
if((ret = connect(sockfd, (SA *)&seraddr, sizeof(seraddr))) < 0)
{
printf("connect error %d\n",ret);
return 0;
}
/*读入并输出服务器的应答*/
while((n = read(sockfd, recvline, MAXLINE)) > 0)
{
recvline[n] = 0;
printf("read success 111: %s", recvline);
if (fputs(recvline, stdout) == EOF)
printf("fputs error\n");
}
if(n < 0)
{
printf( "read error\n");
return 0;
}
printf("read success: %s", recvline);
//exit(0);
return 0;
}
服务器代码
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#define MAXLINE 4096
#define SA struct sockaddr
#define LISTENQ 1024 // 最大客户连接数
/*创建套接字*/
int
Socket(int family, int type, int protocol)
{
int n;
if ((n = socket(family, type, protocol)) < 0)
printf("socket error");
return n;
}
int
main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in seraddr;
char buff[MAXLINE];
time_t ticks;
// 创建tcp流式套接字
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
// 将服务端口绑定到套接字
bzero(&seraddr, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY); // 服务器在任意网络接口上接受客户连接
seraddr.sin_port = htons(13000);
if (bind(listenfd, (SA*)&seraddr, sizeof(seraddr)) < 0)
{
printf("bind error");
return 0;
}
// 监听, 将套接字转换成一个监听套接字,这样来自客户的外来连接就可在该链接字上由内科接受
if (listen(listenfd, LISTENQ) < 0)
{
printf("listen error");
return 0;
}
for(;;)
{
connfd = accept(listenfd, (SA*)NULL, NULL);
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
write(connfd, buff, strlen(buff));
close(connfd);
}
}