当前位置: 技术问答>linux和unix
Socket通信编程问题(急!)
来源: 互联网 发布时间:2015-12-29
本文导语: 1. 有一个服务端软件和一个客户端软件,互相通信,通信方式采用字符串。 2. 客户端获取服务端数据,分析数据,并显示相应数据。 这样的程序应该怎么去实现?应该采用怎样的流程呢? | 我不贴代...
1. 有一个服务端软件和一个客户端软件,互相通信,通信方式采用字符串。
2. 客户端获取服务端数据,分析数据,并显示相应数据。
这样的程序应该怎么去实现?应该采用怎样的流程呢?
2. 客户端获取服务端数据,分析数据,并显示相应数据。
这样的程序应该怎么去实现?应该采用怎样的流程呢?
|
我不贴代码了,你去我的blog上,那里有例子
http://blog.163.com
http://blog.163.com
|
来源:本文出自:http://sunsland.top263.net 作者: (2001-10-23 07:00:00)
概述
回射服务器:echo server
7th 端口; /etc/inetd.conf
1.客户从标准输入读一行文本,写到服务器上
2.服务器从网络输入读此行,并回射给客户
3.客户读此回射行并写到标准输出。
--------------------------------------------------------------------------------
几个读写有关的函数
fputs 和 fgets 标准库函数
//简单的输入和输出程序:
// mystr_client.c
#include "unp.h"
void main(void)
{
char sendline[MAXLINE],recevline[MAXLINE];
fgets(sendline, MAXLINE, stdin); //标准输入
memcpy(recevline, sendline, strlen(sendline));
fputs(recevline, stdout); //标准输出
}
//writen 和 readline字节流读写函数
ssize_t Writen(int filedes, const void *buff, size_t nbytes);
ssize_t Readline(int filedes, void *buff, size_t maxlen);
--------------------------------------------------------------------------------
TCP回射服务器程序
//main源程序:
#include "unp.h"
int
main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
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(SERV_PORT);//9877
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));//绑定端口
Listen(listenfd, LISTENQ);
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);//等待客户完成连接accept
if ( (childpid = Fork()) == 0) { /* child process */
Close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit(0);
}
Close(connfd); /* parent closes connected socket */
}
}
//服务器程序str_echo 函数
//读如一行 Readline
//回射此行 Writen
#include "unp.h"
#include "sum.h"
void
str_echo(int sockfd)
{
ssize_t n;
struct args args;
struct result result;
for ( ; ; ) {
if ( (n = Readn(sockfd, &args, sizeof(args))) == 0)
return; /* connection closed by other end */
result.sum = args.arg1 + args.arg2;
Writen(sockfd, &result, sizeof(result));
}
}
--------------------------------------------------------------------------------
TCP回射客户端程序
//main创建套接口,装填IP地址结构socket bzero与服务器连接connect
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: tcpcli ");
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
str_cli(stdin, sockfd); /* do it all */
exit(0);
}
//tcp回射客户程序str_cli函数
#include "unp.h"
void
str_echo(int sockfd)
{
long arg1, arg2;
ssize_t n;
char line[MAXLINE];
for ( ; ; ) {
if ( (n = Readline(sockfd, line, MAXLINE)) == 0)
//从服务器读回射行
return; /* connection closed by other end */
if (sscanf(line, "%ld%ld", &arg1, &arg2) == 2)
snprintf(line, sizeof(line), "%ldn", arg1 + arg2);
else
snprintf(line, sizeof(line), "input errorn");
n = strlen(line);
Writen(sockfd, line, n);//写到服务器
}
}
--------------------------------------------------------------------------------
正常启动
服务器后台启动 ./tcpserv01 &
检查监听套接口状态 netstat –a
过滤:netstat –a |grep 9877
启动客户端程序 ./tcpcli01 127.0.0.1
检查TCP的连接 netstat –a
过滤:netstat –a |grep 9877
概述
回射服务器:echo server
7th 端口; /etc/inetd.conf
1.客户从标准输入读一行文本,写到服务器上
2.服务器从网络输入读此行,并回射给客户
3.客户读此回射行并写到标准输出。
--------------------------------------------------------------------------------
几个读写有关的函数
fputs 和 fgets 标准库函数
//简单的输入和输出程序:
// mystr_client.c
#include "unp.h"
void main(void)
{
char sendline[MAXLINE],recevline[MAXLINE];
fgets(sendline, MAXLINE, stdin); //标准输入
memcpy(recevline, sendline, strlen(sendline));
fputs(recevline, stdout); //标准输出
}
//writen 和 readline字节流读写函数
ssize_t Writen(int filedes, const void *buff, size_t nbytes);
ssize_t Readline(int filedes, void *buff, size_t maxlen);
--------------------------------------------------------------------------------
TCP回射服务器程序
//main源程序:
#include "unp.h"
int
main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
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(SERV_PORT);//9877
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));//绑定端口
Listen(listenfd, LISTENQ);
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);//等待客户完成连接accept
if ( (childpid = Fork()) == 0) { /* child process */
Close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit(0);
}
Close(connfd); /* parent closes connected socket */
}
}
//服务器程序str_echo 函数
//读如一行 Readline
//回射此行 Writen
#include "unp.h"
#include "sum.h"
void
str_echo(int sockfd)
{
ssize_t n;
struct args args;
struct result result;
for ( ; ; ) {
if ( (n = Readn(sockfd, &args, sizeof(args))) == 0)
return; /* connection closed by other end */
result.sum = args.arg1 + args.arg2;
Writen(sockfd, &result, sizeof(result));
}
}
--------------------------------------------------------------------------------
TCP回射客户端程序
//main创建套接口,装填IP地址结构socket bzero与服务器连接connect
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: tcpcli ");
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
str_cli(stdin, sockfd); /* do it all */
exit(0);
}
//tcp回射客户程序str_cli函数
#include "unp.h"
void
str_echo(int sockfd)
{
long arg1, arg2;
ssize_t n;
char line[MAXLINE];
for ( ; ; ) {
if ( (n = Readline(sockfd, line, MAXLINE)) == 0)
//从服务器读回射行
return; /* connection closed by other end */
if (sscanf(line, "%ld%ld", &arg1, &arg2) == 2)
snprintf(line, sizeof(line), "%ldn", arg1 + arg2);
else
snprintf(line, sizeof(line), "input errorn");
n = strlen(line);
Writen(sockfd, line, n);//写到服务器
}
}
--------------------------------------------------------------------------------
正常启动
服务器后台启动 ./tcpserv01 &
检查监听套接口状态 netstat –a
过滤:netstat –a |grep 9877
启动客户端程序 ./tcpcli01 127.0.0.1
检查TCP的连接 netstat –a
过滤:netstat –a |grep 9877