
1
1.服务器端的代码:
void
SocketServer::CreateConnect(){std::cout<<"start Create
Socket!"<<std::endl m_nSocket = -1 struct sockaddr_in
server_addr struct sockaddr_in client_addr int
portnumber=4321 if((m_nSocket=socket(AF_INET,SOCK_STREAM,0))==-1)
{std::cout<<"socket Create
Failed!"<<strerror(errno)<<std::endl return }
std::cout<<"Create Socket Finish!"<<std::endl/*
服务器端填充 sockaddr结构 */bzero(&server_addr,sizeof(struct
sockaddr_in)) server_addr.sin_family=AF_INET
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1")
server_addr.sin_port=htons(portnumber) /* 捆绑sockfd描述符 */
if(bind(m_nSocket,(struct sockaddr *)(&server_addr),sizeof(struct
sockaddr))==-1){std::cout<<"Server Bind
Failed!"<<strerror(errno)<<std::endl return }
std::cout<<"bind Socket Finish!"<<std::endl /*
监听sockfd描述符 */if(listen(m_nSocket,5)==-1){
std::cout<<"Listen
Failed!"<<strerror(errno)<<std::endl return }
std::cout<<"listen Socket Finish!"<<std::endl
while(1){/* 服务器阻塞,直到客户程序建立连接 */
std::cout<<"listen start..."<<std::endl int
nNewFd=-1 size_t nSize = sizeof(struct sockaddr_in)
if((nNewFd=accept(m_nSocket,(struct sockaddr
*)(&client_addr),&(nSize))) == -1){
std::cout<<"accept
Failed!"<<strerror(errno)<<std::endl return
}std::cout<<"server Get Connect
from:"<<inet_ntoa(client_addr.sin_addr)<<std::endl
while(1){char buf[256] = "0" size_t
len = recv( nNewFd, buf, 256, 0)if ( len >0)
std::cout<<"接受的消息为:"<<buf<<std::endl
else {if ( len <0)
std::cout<<"错误为:"<<strerror( errno)<<std::endl
else
std::cout<<"客户端断开:"<<std::endl break
}}/* 这个通讯已经结束 *///close(nNewFd)
/* 循环下一个 */}}
2
2.客户端代码:
//
创建链接void SocketClient::CreateConnect(){char buffer[1024] struct
sockaddr_in server_addr std::cout<<"socket create
start!"<<std::endl /* 客户程序开始建立 sockfd描述符 */
if((m_nSocket=socket(AF_INET,SOCK_STREAM,0))==-1){
std::cout<<"Client socket Create
Failed!!"<<strerror(errno)<<std::endl return }
std::cout<<"socket create finshed!"<<std::endl /*
客户程序填充服务端的资料 */int portnumber = 4321
bzero(&server_addr,sizeof(server_addr))
server_addr.sin_family=AF_INET
server_addr.sin_port=htons(portnumber)
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1") /*
客户程序发起连接请求 */if(connect(m_nSocket,(struct sockaddr
*)(&server_addr),sizeof(struct sockaddr))==-1){
std::cout<<"Client connect
Fialed!"<<strerror(errno)<<std::endl return }
std::cout<<"connect finshed!"<<std::endl std::string
str="start..." while(!str.empty()){
std::cout<<"starting....!"<<std::endl
std::cin>>str size_t len = send ( m_nSocket, str.c_str(),
str.length(), 0)if ( len <0){
std::cout<<"消息发送失败"<<str<<strerror
(errno)<<std::endl }else{
std::cout<<"消息发送成功"<<str<<std::endl }}
close(m_nSocket)}
3
3.编译完成后,启动服务器端代码和客户端代码就可以进行通信了。
4
4.
普及一下TCP/IP协议的部分知识,大家都知道TCP是面向链接的协议,即在进行通信前服务器是被动链接,客户端是主动链接,那么客户端与服务器端的连
接需要经过三次握手才能建立链接。在整个通信过程中客户端与服务器端的进行的通信都有确认机制,保证包能顺利的到达对方,但这也不是100%,中间的路由
等中间桥出现问题,也有可能造成数据包的丢失,而任何一方没有收到确认包,都会一直处于等待和重传的过程中...
服务器:
创建socket->bind->listen->recv(send)->close
客户端:
创建socket->connect->recv(send)->close
你自己都没有说清楚,叫我们怎么说清楚?是装虚拟机安装还是实体安装?实体就如此安装就可以了,要注意的只有引导问题,装好windows了之后可能会出现grub引导的丢失,无法引导ubuntu系统,修复一下引导就可以
1,使用livecd(强烈推荐)
使用任何你喜欢的linux livecd(比如,ubuntu 6.06的desktop cd)
在终端下输入:
代码:
sudo su
grub
你应该看到像这样的东西:
代码:
grub>
接着输入:
代码:
root (hdx,y)
setup (hdx)
请不要完全照样输入!请弄懂这些命令的含义。
hd表示硬盘,格式是
(hd硬盘号,分区号)
从零开始计算。
所以(按照日常的习惯,从1开始数),(hd0,0)表示第一个硬盘的第一个分区,(hd0,1)表示第一个硬盘的第2个分区,(hd1,4)表示第2个硬盘的第5个分区。
(注意,linux系统里是用hda1表示第一个硬盘的第一个分区,不要把它和grub中的表示混起来。)
root (hdx,y)
这里的(hdx,y) 是/boot 目录所在的分区(通常情况下,也就是你装ubuntu系统的分区,除非你安装的时候把/boot分出去了。)如果你不知道你把ubuntu装在第几个分区,可以在输入root (hd0, 时按Tab键来补全。(假设你把ubuntu装在第一块硬盘上)
按了tab后,你将看到一些有关各个分区的信息。通常你可以通过分区的大小和格式看出你把ubuntu系统装在哪里了。
setup (hdx) 通常情况下,是setup (hd0)。(多半你把ubuntu装在第一块硬盘上。)要注意的是,不要输入setup (hd0,0)。我曾经犯过这个错误。(如果你没把命令抄下来,凭记忆 *** 作的话,可能会犯这种错误。)
最后,用
代码:
quit
退出grub,重启系统。
好了,总结一下用到的命令(建议你把下面的代码抄在纸上。如果你对(hdx,y)表示的含义还感觉模糊,最好把上面几段解释也抄下来。)
代码:
sudo su
grub
root (hdx,y)
setup(hdx)
quit
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)