Unix网络编程---第一次作业
2015-11-24 01:01
363 查看
Unix网络编程---第一次作业
要求:
客户端:从命令行读入服务器的IP地址;并连接到服务器;
服务器端: 接受客户的连接请求,并显示客户的IP地址和端口号。
实现代码:
1、客户端程序:my_client.c
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#define UPORT 8088 /*This is the port number used by me */
#define MAXLINE 256
int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2){
perror("usage: a.out <IPaddress>");
exit(-1);
}
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket error");
exit(-1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(UPORT); /* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s", argv[1]);
exit(-1);
}
if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
perror("connect error");
exit(-1);
}
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline
='\0'; // '\0' ASXII code is 0, so also can use 0;
if (fputs(recvline, stdout) == EOF){
perror("fputs error");
exit(-1);
}
}
if (n < 0)
perror("read error");
exit(0);
}
2、服务端程序:my_server.c
#include <sys/socket.h>
#include <sys/types.h>/*The funcion sizeof,socklen_t need*/
#include <netinet/in.h>/*The funcion sockaddr_in need*/
#include <unistd.h>
#include <arpa/inet.h>/*The funcion inet_ntoa need*/
#include <string.h>/*The funcion strlen need*/
#define UPORT 8088 /*This is the port number used by me */
#define MAXLINE 256
#define LISTENQ 32
int
main(int argc, char **argv)
{
int listenfd, connfd,reuse;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
socklen_t addrlen;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(UPORT); /* server port setting */
if( setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){
perror("There is an error occured when the program set REUSEADDR symbol");
return -1;
}
if(bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))==-1){
perror("%s\r\n","bind error");
exit(-1);
}
listen(listenfd, LISTENQ);
addrlen=sizeof(cliaddr);
for ( ; ; ) {
if((connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &addrlen))==-1){
perror("%s\r\n","An error occured while tring to creat a connfd! ");
exit(-1);
}
snprintf(buff, sizeof(buff), "%s %s:%d\r\n","The connection is successful, the ip address and port you are using are",inet_ntoa(cliaddr.sin_addr),cliaddr.sin_port );
printf("the new connection address is:%s:%d\r\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);
write(connfd, buff, strlen(buff));
//send(connfd,"ok\n",4,0);
close(connfd);
}
}
运行截图
编译:gcc my_client.c -o my_client
gcc my_server.c -o my_server
服务端运行:./my_server
客户端运行:./my_client 192.168.1.119
本实验是在两台虚拟机上操作,服务端ip为192.168.1.119,客户端ip为192.168.1.120
1、客户端:
2、服务端:
总结
1、 注意细节,免走弯路
2、 了解原理,举一反三
要求:
客户端:从命令行读入服务器的IP地址;并连接到服务器;
服务器端: 接受客户的连接请求,并显示客户的IP地址和端口号。
实现代码:
1、客户端程序:my_client.c
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#define UPORT 8088 /*This is the port number used by me */
#define MAXLINE 256
int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2){
perror("usage: a.out <IPaddress>");
exit(-1);
}
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket error");
exit(-1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(UPORT); /* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s", argv[1]);
exit(-1);
}
if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
perror("connect error");
exit(-1);
}
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline
='\0'; // '\0' ASXII code is 0, so also can use 0;
if (fputs(recvline, stdout) == EOF){
perror("fputs error");
exit(-1);
}
}
if (n < 0)
perror("read error");
exit(0);
}
2、服务端程序:my_server.c
#include <sys/socket.h>
#include <sys/types.h>/*The funcion sizeof,socklen_t need*/
#include <netinet/in.h>/*The funcion sockaddr_in need*/
#include <unistd.h>
#include <arpa/inet.h>/*The funcion inet_ntoa need*/
#include <string.h>/*The funcion strlen need*/
#define UPORT 8088 /*This is the port number used by me */
#define MAXLINE 256
#define LISTENQ 32
int
main(int argc, char **argv)
{
int listenfd, connfd,reuse;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
socklen_t addrlen;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(UPORT); /* server port setting */
if( setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){
perror("There is an error occured when the program set REUSEADDR symbol");
return -1;
}
if(bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))==-1){
perror("%s\r\n","bind error");
exit(-1);
}
listen(listenfd, LISTENQ);
addrlen=sizeof(cliaddr);
for ( ; ; ) {
if((connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &addrlen))==-1){
perror("%s\r\n","An error occured while tring to creat a connfd! ");
exit(-1);
}
snprintf(buff, sizeof(buff), "%s %s:%d\r\n","The connection is successful, the ip address and port you are using are",inet_ntoa(cliaddr.sin_addr),cliaddr.sin_port );
printf("the new connection address is:%s:%d\r\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);
write(connfd, buff, strlen(buff));
//send(connfd,"ok\n",4,0);
close(connfd);
}
}
运行截图
编译:gcc my_client.c -o my_client
gcc my_server.c -o my_server
服务端运行:./my_server
客户端运行:./my_client 192.168.1.119
本实验是在两台虚拟机上操作,服务端ip为192.168.1.119,客户端ip为192.168.1.120
1、客户端:
2、服务端:
总结
1、 注意细节,免走弯路
2、 了解原理,举一反三
相关文章推荐
- TCP/IP三次握手协议
- 关于 Windows XP 与 HTTPS 兼容的事情
- IOS网络访问之使用AFNetworking
- 上网访问速度慢的原因(计算机网络常识)
- 上网访问速度慢的原因(计算机网络常识)
- python-11:HTTP headers是什么
- 01 -- UDP vs. TCP (part 1)
- Linux下SVN服务器支持Apache的http和svnserve独立服务器
- linux网络编程--IO模型
- centos6.5 NAT方式 连接网络
- 备战CTF刷题(一)网络信息安全攻防学习平台——基础题
- 开源C/C++网络库比较:ACE、livevent和Boost
- intel edison RNDIS网络的固定IP设置
- 00 -- Profile
- 大型分布式网站架构设计与实践 第一章《面向服务的体系架构(SOA)》1.1基于TCP协议的RPC
- netstat sysctl 查看tcp连接的当前状态
- Java网络编程之NetworkInterface
- 【鸟哥的linux私房菜-学习笔记】网络安全与主机基本防护
- 贝叶斯网络(Bayesian Network)
- Volley -- 网络请求源码分析