每一种编程语言都有socketAPI,所以每种语言都能用于网络编程。高并发的Server是用C写的。UDPTCP是四层协议,和编程语言并没有关系,但协议结构都是以C为蓝本设计的,所以用C的struct就可以很方便的组装报文。二进制协议用C开发是最方便的。
如果你的socket协议族是AF_INET,然后类型是SOCK_STREAM,那么是通过TCP协议进行通信的,
如果是SOCK_DGRAM,那么是UDP通信的,无论TCP还是UDP,都会带有IP 地址头。
如果是都在本机,有可能通过127001这个回环地址进行通信,回环地址和你的网卡不是一个设备,可能你抓错了设备,所以抓不到包,你可以尝试抓一下loop back/本地回环,这样名字的那个设备。
如果你是AF_LOCAL/AF_UNIX,那么它是通过sock文件进行通信的,这个抓不到。
1、要实现网络编程,首先得了解网络编程的原理。
大部分网络编程底层都是通过TCP/IP或者UDP协议进行通讯,不管是TCP还是UDP通讯,都是通过调用socket实现的。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
Socket通讯分为两部分:服务器端和客户端,服务器端监听客户端的连接,连接上之后,实现数据通讯,流程
2、用C语言调用Socket实现通讯
服务器端示例代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#definePORT1500//端口号
#defineBACKLOG5/最大监听数/
intmain(){
intsockfd,new_fd;/socket句柄和建立连接后的句柄/
structsockaddr_inmy_addr;/本方地址信息结构体,下面有具体的属性赋值/
structsockaddr_intheir_addr;/对方地址信息/
intsin_size;
sockfd=socket(AF_INET,SOCK_STREAM,0);//建立socket
if(sockfd==-1){
printf(\"socketfailed:%d
1、可以在client端登入时write(发送)帐号和密码给server端,当server端接受到内容时判断是否是你预设的帐号密码,是则允许下载,否则关闭其socket。
2、是要客户端看到进度条? 这样就要要求在下载文件时server端要先发这个文件的大小给client端,client端就可以通过这个大小和接受到的字节数比较后打印进度条(printf("#");)
文件大小可用int stat(const char restrict path, struct stat restrict buf);函数获取。
现在总结了六种方式:
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection。
(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。
(5)使用WebService。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice。
(6)直接使用WebView视图组件显示网页。基于WebView
进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
你的代码和你的问题根本就不是一码事啊,你的问题是写的UDP程序会死,可实际上你写的TCP,Socket s = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp),明明建立的是TCP的socket,另外UDP是不需要accept的,只需要recv就行。TCP首先要recv,再accept。你这个代码完全是错误的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)